Re: [pgbr-geral] Ajuda com função

2015-09-28 Por tôpico Sebastian Webber
Em 28 de setembro de 2015 06:41, Eloi  escreveu:

> On 2015-09-25 10:33, Eloi wrote:
>
>> 1) A função não esta a funcionar devidamente. Suponho que relacionado
>> com esta parte:
>> AND t2.country_id = '||$$'$$||quote_ident(country_code)||$$'$$
>> Algo esta mal que não consigo identificar.
>>
>
> O quote_ident() sobra, julgo que porque se trata de uma string e não de um
> objeto.
> Assim já funciona:
> AND t2.country_id = '||$$'$$||country_code||$$'$$
>


Como você queria representar os dados? quote_ident vai colocar eles entre
aspas duplas. Talvez o bloco todo possa ser reescrito com quote_literal:

AND t2.country_id = QUOTE_LITERAL(country_code)


Dê uma olhada nos detalhes na doc[1].

Um abraço!

[1] http://www.postgresql.org/docs/9.4/static/functions-string.html


-- 
Sebastian Webber
http://swebber.me
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Ajuda com função

2015-09-28 Por tôpico Eloi

On 2015-09-28 16:21, Sebastian Webber wrote:

AND t2.country_id = '||$$'$$||country_code||$$'$$


Como você queria representar os dados? quote_ident vai colocar eles
entre aspas duplas. Talvez o bloco todo possa ser reescrito com
quote_literal:


AND t2.country_id = QUOTE_LITERAL(country_code)


Sim é isso, não conhecia QUOTE_LITERAL(), fica muito mais simples. 
Obrigado!

Eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Ajuda com função

2015-09-28 Por tôpico Eloi

On 2015-09-25 10:33, Eloi wrote:

1) A função não esta a funcionar devidamente. Suponho que relacionado
com esta parte:
AND t2.country_id = '||$$'$$||quote_ident(country_code)||$$'$$
Algo esta mal que não consigo identificar.


O quote_ident() sobra, julgo que porque se trata de uma string e não de 
um objeto.

Assim já funciona:
AND t2.country_id = '||$$'$$||country_code||$$'$$

Eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

[pgbr-geral] Ajuda com Função

2014-12-16 Por tôpico Matheus Saraiva
Ao usar a seguinte função

http://paste.ubuntu.com/9543365/

Estou recebendo um erro, informando que a função atingiu o fim e não
encontrou um retorno. Não tenho muita experiência com PLPGSQL mas
acredito que o retorno final está lá (RETURN sucess;)
-- 
Matheus Saraiva da Silva
Chapecó - SC
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função

2014-12-16 Por tôpico Matheus de Oliveira
2014-12-16 17:47 GMT-02:00 Matheus Saraiva matheus.sara...@gmail.com:

 Ao usar a seguinte função

 http://paste.ubuntu.com/9543365/

 Estou recebendo um erro, informando que a função atingiu o fim e não
 encontrou um retorno. Não tenho muita experiência com PLPGSQL mas acredito
 que o retorno final está lá (*RETURN sucess;*)


Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa linha
para antes da EXCEPTION, linha 15.

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função

2014-12-16 Por tôpico Matheus Saraiva
Em Ter, 2014-12-16 às 17:56 -0200, Matheus de Oliveira escreveu:
 
 2014-12-16 17:47 GMT-02:00 Matheus Saraiva
 matheus.sara...@gmail.com:
 Ao usar a seguinte função
 
 http://paste.ubuntu.com/9543365/
 
 Estou recebendo um erro, informando que a função atingiu o fim
 e não encontrou um retorno. Não tenho muita experiência com
 PLPGSQL mas acredito que o retorno final está lá (RETURN
 sucess;)
 
 
 Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa
 linha para antes da EXCEPTION, linha 15.
 
 
 Atenciosamente,
 -- 
 Matheus de Oliveira
 Analista de Banco de Dados
 Dextra Sistemas - MPS.Br nível F!
 www.dextra.com.br/postgres
 
 
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Ok, deu certo. Esse bloco exception é diferente do que eu imaginava,
achei quele ele terminasse quando não encontrasse mais clausulas when
then. Pelo visto ele não tem um delimitador que marque o seu fim.
-- 
Matheus Saraiva da Silva
Chapecó - SC

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função

2014-12-16 Por tôpico Osvaldo Kussama
Em 16/12/14, Matheus Saraivamatheus.sara...@gmail.com escreveu:
 Em Ter, 2014-12-16 às 17:56 -0200, Matheus de Oliveira escreveu:

 2014-12-16 17:47 GMT-02:00 Matheus Saraiva
 matheus.sara...@gmail.com:
 Ao usar a seguinte função

 http://paste.ubuntu.com/9543365/

 Estou recebendo um erro, informando que a função atingiu o fim
 e não encontrou um retorno. Não tenho muita experiência com
 PLPGSQL mas acredito que o retorno final está lá (RETURN
 sucess;)


 Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa
 linha para antes da EXCEPTION, linha 15.


 Atenciosamente,
 --
 Matheus de Oliveira
 Analista de Banco de Dados
 Dextra Sistemas - MPS.Br nível F!
 www.dextra.com.br/postgres


 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

 Ok, deu certo. Esse bloco exception é diferente do que eu imaginava,
 achei quele ele terminasse quando não encontrasse mais clausulas when
 then. Pelo visto ele não tem um delimitador que marque o seu fim.
 --


De:
http://www.postgresql.org/docs/current/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING

If no error occurs, this form of block simply executes all the
statements, and then control passes to the next statement after END.
But if an error occurs within the statements, further processing of
the statements is abandoned, and control passes to the EXCEPTION list.
The list is searched for the first condition matching the error that
occurred. If a match is found, the corresponding handler_statements
are executed, and then control passes to the next statement after
END.

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função

2014-12-16 Por tôpico Matheus de Oliveira
Em 16/12/2014 18:11, Matheus Saraiva matheus.sara...@gmail.com escreveu:

 Em Ter, 2014-12-16 às 17:56 -0200, Matheus de Oliveira escreveu:
 
  2014-12-16 17:47 GMT-02:00 Matheus Saraiva
  matheus.sara...@gmail.com:
  Ao usar a seguinte função
 
  http://paste.ubuntu.com/9543365/
 
  Estou recebendo um erro, informando que a função atingiu o fim
  e não encontrou um retorno. Não tenho muita experiência com
  PLPGSQL mas acredito que o retorno final está lá (RETURN
  sucess;)
 
 
  Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa
  linha para antes da EXCEPTION, linha 15.
 

 Ok, deu certo. Esse bloco exception é diferente do que eu imaginava,
 achei quele ele terminasse quando não encontrasse mais clausulas when
 then. Pelo visto ele não tem um delimitador que marque o seu fim.

O final de cada WHEN seria até encontrar o próximo WHEN ou, no caso do
último,  até encontrar a cláusula END. Lembre-se que você pode aninhar
blocos BEGIN/EXCEPTION/END, assim você pode ter um bloco interno:

BEGIN
...
BEGIN
...
EXCEPTION
...
END
RETURN ...;
END;
 --
 Matheus Saraiva da Silva
 Chapecó - SC

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] ajuda com função

2013-12-18 Por tôpico Eloi
Ola a toda a lista,

Estou a tentar fazer funcionar a seguinte função para mover todas as
tabelas de um esquema para outro.
Não obtenho nenhum erro mas no entanto nada é movido.
Peculiaridades: o nome do esquema de origem está em PascalCase e o de
destino em minúsculas.

Alguém me pode indicar o que estou a fazer mal?

CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text)
  RETURNS text AS
$BODY$
DECLARE
row record;
BEGIN
FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from
LOOP
EXECUTE 'ALTER TABLE ' || sch_from || '.' ||
quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';';
END LOOP;
RETURN 'Tables were moved';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres;

SELECT sys_move_tables('OrigEm', 'destino');

Obrigado. Cumprimentos,

Eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] ajuda com função

2013-12-18 Por tôpico Matheus de Oliveira
2013/12/18 Eloi e...@openmailbox.org

 Ola a toda a lista,

 Estou a tentar fazer funcionar a seguinte função para mover todas as
 tabelas de um esquema para outro.
 Não obtenho nenhum erro mas no entanto nada é movido.
 Peculiaridades: o nome do esquema de origem está em PascalCase e o de
 destino em minúsculas.

 Alguém me pode indicar o que estou a fazer mal?

 CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text)
   RETURNS text AS
 $BODY$
 DECLARE
 row record;
 BEGIN
 FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from
 LOOP
 EXECUTE 'ALTER TABLE ' || sch_from || '.' ||
 quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';';
 END LOOP;
 RETURN 'Tables were moved';
 END;
 $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;

 ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres;

 SELECT sys_move_tables('OrigEm', 'destino');

 Obrigado. Cumprimentos,


Simples. Sua função não executa nada por causa da seguinte consulta:

SELECT tablename FROM pg_tables WHERE schemaname = sch_from;

Veja que você passou 'OrigEm' para sch_from, logo essa consulta ficaria:

SELECT tablename FROM pg_tables WHERE schemaname = 'OrigEm';

Mas nas tabelas de catálogo, os nomes são armazenados diretamente, sem
aspas duplas, logo sua consulta não traz nenhum registros e o loop não é
executado.

A solução é não passar com aspas duplas na chamada da função e tratar
dentro da mesma:

CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text)
  RETURNS text AS
$BODY$
DECLARE
row record;
BEGIN
FOR row IN SELECT tablename FROM pg_tables WHERE schemaname =
sch_from
LOOP
EXECUTE 'ALTER TABLE ' || quote_ident(sch_from) || '.' ||
quote_ident(row.tablename) || ' SET SCHEMA ' || quote_ident(sch_to) ||
';';
END LOOP;
RETURN 'Tables were moved';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

SELECT sys_move_tables('OrigEm', 'destino');


Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] ajuda com função

2013-12-18 Por tôpico Eloi Ribeiro

On 2013-12-18 15:23, Matheus de Oliveira wrote:

2013/12/18 Eloi e...@openmailbox.org


Ola a toda a lista,

Estou a tentar fazer funcionar a seguinte função para mover todas
as
tabelas de um esquema para outro.
Não obtenho nenhum erro mas no entanto nada é movido.
Peculiaridades: o nome do esquema de origem está em PascalCase e
o de
destino em minúsculas.

Alguém me pode indicar o que estou a fazer mal?

CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to
text)
  RETURNS text AS
$BODY$
DECLARE
    row record;
BEGIN
    FOR row IN SELECT tablename FROM pg_tables WHERE schemaname =
sch_from
    LOOP
        EXECUTE 'ALTER TABLE ' || sch_from || '.' ||
quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';';
    END LOOP;
RETURN 'Tables were moved';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres;

SELECT sys_move_tables('OrigEm', 'destino');

Obrigado. Cumprimentos,


Simples. Sua função não executa nada por causa da seguinte
consulta:

    SELECT tablename FROM pg_tables WHERE schemaname = sch_from;

Veja que você passou 'OrigEm' para sch_from, logo essa consulta
ficaria:

    SELECT tablename FROM pg_tables WHERE schemaname = 'OrigEm';

Mas nas tabelas de catálogo, os nomes são armazenados diretamente,
sem aspas duplas, logo sua consulta não traz nenhum registros e o
loop não é executado.

A solução é não passar com aspas duplas na chamada da função e
tratar dentro da mesma:

    CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text,
sch_to text)
  RETURNS text AS
    $BODY$
    DECLARE
    row record;
    BEGIN
     FOR row IN SELECT tablename FROM pg_tables WHERE
schemaname = sch_from
    LOOP
    EXECUTE 'ALTER TABLE ' || quote_ident(sch_from)
|| '.' ||
    quote_ident(row.tablename) || ' SET SCHEMA ' ||
quote_ident(sch_to) || ';';
     END LOOP;
    RETURN 'Tables were moved';
    END;
    $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
   
    SELECT sys_move_tables('OrigEm', 'destino');

Atenciosamente,

--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres [1]



Certo, já funciona.
Obrigado pela ajuda!

Eloi








___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] ajuda com função

2013-12-18 Por tôpico Guimarães Faria Corcete DUTRA , Leandro
2013/12/18 Eloi Ribeiro e...@openmailbox.org:
 On 2013-12-18 15:23, Matheus de Oliveira wrote:
 www.dextra.com.br/postgres [1]

 Certo, já funciona.

Sim, a Dextra funciona, e o PostgreSQL também.

Brincadeirinha… mas como você não cortou nem sequer a assinatura da
mensagem a que respondeu, foi como o gMail me mostrou tua resposta.

Além de evitar o /top posting/, outro ponto da netiqueta — não lembro
se chega a estar na RFC 1855 — é cortar da mensagem respondida tudo a
que não se está respondendo diretamente, a menos que seja importante
para contextualizar.  E evita esses efeitos colaterais engraçados.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] ajuda com função

2013-12-18 Por tôpico Eloi
On 18-12-13 18:51, Guimarães Faria Corcete DUTRA, Leandro wrote:
 2013/12/18 Eloi Ribeiro e...@openmailbox.org:
 On 2013-12-18 15:23, Matheus de Oliveira wrote:
 www.dextra.com.br/postgres [1]
 Certo, já funciona.
 Sim, a Dextra funciona, e o PostgreSQL também.

 Brincadeirinha… mas como você não cortou nem sequer a assinatura da
 mensagem a que respondeu, foi como o gMail me mostrou tua resposta.

 Além de evitar o /top posting/, outro ponto da netiqueta — não lembro
 se chega a estar na RFC 1855 — é cortar da mensagem respondida tudo a
 que não se está respondendo diretamente, a menos que seja importante
 para contextualizar.  E evita esses efeitos colaterais engraçados.

Estava eu a pensar por onde cortar quando respondi mas não sabia por
onde e decidi não cortar.
Não conhecia esse critério, terei em conta na próxima vez.
Sim, esta na 'RFC 1855' (também ignorava): 'When replying to a message,
include enough original material to be understood but no more.'
Sempre aprender :-)



___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Ajuda com função

2012-09-18 Por tôpico Stclara
Salve, pessoal. Estou precisando desenvolver uma função para retornar 
saldo e comecei desta maneira, mas não retorna dados:

Criei um type:
CREATE TYPE saldo_caixa AS (
   debito numeric(18,2)
  );

A função:
CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS
$body$
DECLARE
   debito_atual NUMERIC(18,2);
   linha saldo_caixa;
begin
   SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE 
(type_cash= 'D');
   linha.debito = debito_atual;
RETURN;
END
$body$
LANGUAGE 'plpgsql';


Aí para usar:
select * from saldocaixa().

No entanto, não retorna valor algum. Onde estou errando?

[]'s

Stclara.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2012-09-18 Por tôpico Marcone
Em 18 de setembro de 2012 15:26, Stclara stcl...@gmail.com escreveu:

 A função:
 CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS
 $body$
 DECLARE
debito_atual NUMERIC(18,2);
linha saldo_caixa;
 begin
SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE
 (type_cash= 'D');
linha.debito = debito_atual;
 RETURN;
 END
 $body$
 LANGUAGE 'plpgsql';


 Aí para usar:
 select * from saldocaixa().

 No entanto, não retorna valor algum. Onde estou errando?


Pude identificar duas razões para o retorno vazio:
I - Verifique se na tabela cashes a coluna type_cash possui valores
iguais a 'D (creio que sim);
II - Para que uma função que retorna set of funcione adequadamente
você tem que usar return next para cada registro retornado  e
return no final [1].
III - Levando em conta que sua função retornará mais de um registro é
bom você dar uma olhada no for select loop [1] e [2].

[1] - 
http://www.postgresql.org/docs/9.2/static/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING
[2] - 
http://www.postgresql.org/docs/9.2/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING

-- 
Marcone Peres - DBA
http://www.linkedin.com/in/marconeperes
@marconeperes
(61) 8146-0028
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2012-09-18 Por tôpico Irineu
Em 18/09/2012 15:26, Stclara escreveu:
 Salve, pessoal. Estou precisando desenvolver uma função para retornar
 saldo e comecei desta maneira, mas não retorna dados:

 Criei um type:
 CREATE TYPE saldo_caixa AS (
 debito numeric(18,2)
);

 A função:
 CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS
 $body$
 DECLARE
 debito_atual NUMERIC(18,2);
 linha saldo_caixa;
 begin
 SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE
 (type_cash= 'D');
 linha.debito = debito_atual;
 RETURN;
 END
 $body$
 LANGUAGE 'plpgsql';



uma outra possibilidade:

CREATE OR REPLACE FUNCTION saldocaixa()
  RETURNS SETOF saldo_caixa AS
$body$
DECLARE
debito_atual NUMERIC(18,2);
linha saldo_caixa;
begin
  RETURN Query SELECT SUM(value_cash)::NUMERIC(18,2) FROM cashes WHERE 
(type_cash= 'D');
END
$body$
LANGUAGE 'plpgsql';



-- 
Irineu Raymundo
Programador/Consultor Técnico
Senda Engenharia de Dados Ltda.

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - Resolvido

2012-09-18 Por tôpico Stclara
Salve, senhores.

Ficou assim:
CREATE TYPE saldo_caixa AS (
   saldo_anterior numeric(18,2),
   debito numeric(18,2),
   credito numeric(18,2),
   saldo numeric(18,2),
   inicio date,
   fim date
  );

CREATE OR REPLACE FUNCTION saldocaixa(date, date) RETURNS SETOF 
saldo_caixa AS
$body$
DECLARE
   debito_ant NUMERIC(18,2);
   credito_ant NUMERIC(18,2);
   debito_atual NUMERIC(18,2);
   credito_atual NUMERIC(18,2);
   linha saldo_caixa;

begin
   linha.saldo_anterior := 0;
   linha.debito := 0;
   linha.credito := 0;
   linha.saldo := 0;

   SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE 
(type_cash= 'D' and date_cash between $1 and $2);
   SELECT INTO credito_atual SUM(value_cash) FROM cashes WHERE 
(type_cash= 'C' and date_cash between $1 and $2);
   SELECT INTO credito_ant SUM(value_cash) FROM cashes WHERE (type_cash= 
'C' and date_cash  $1 );
   SELECT INTO debito_ant SUM(value_cash) FROM cashes WHERE (type_cash= 
'D' and date_cash  $1 );

   if credito_atual is null then credito_atual = 0; end if;
   if debito_atual is null then debito_atual = 0; end if;
   if credito_ant is null then credito_ant = 0; end if;
   if debito_ant is null then debito_ant = 0; end if;

   linha.saldo_anterior = (credito_ant - debito_ant);
   linha.debito = debito_atual;
   linha.credito = credito_atual;
   linha.saldo = linha.saldo_anterior - (credito_atual - debito_atual);
   linha.inicio = $1;
   linha.fim = $2;
   return next linha;
RETURN;
END
$body$
LANGUAGE 'plpgsql';

Aí chamo: select * from saldocaixa('2012-09-18', '2012-09-18').

Estou utilizando com rails em um projeto: http://siga.herokuapp.com/.
Breve coloco o código no github.

Obrigado a todos.

[]'s

Stclara.


Em 18-09-2012 17:06, Irineu escreveu:
 Em 18/09/2012 15:26, Stclara escreveu:
 Salve, pessoal. Estou precisando desenvolver uma função para retornar
 saldo e comecei desta maneira, mas não retorna dados:

 Criei um type:
 CREATE TYPE saldo_caixa AS (
  debito numeric(18,2)
 );

 A função:
 CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS
 $body$
 DECLARE
  debito_atual NUMERIC(18,2);
  linha saldo_caixa;
 begin
  SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE
 (type_cash= 'D');
  linha.debito = debito_atual;
 RETURN;
 END
 $body$
 LANGUAGE 'plpgsql';


 uma outra possibilidade:

 CREATE OR REPLACE FUNCTION saldocaixa()
RETURNS SETOF saldo_caixa AS
 $body$
 DECLARE
  debito_atual NUMERIC(18,2);
  linha saldo_caixa;
 begin
RETURN Query SELECT SUM(value_cash)::NUMERIC(18,2) FROM cashes WHERE 
 (type_cash= 'D');
 END
 $body$
 LANGUAGE 'plpgsql';




___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-20 Por tôpico Eloi Ribeiro
Obrigado a todos pelas vossas dicas.

Fiz isso, retirei a parte de criação de colunas da função e agora não salta
nenhum erro.
No entanto seria de esperar que quando um polígono fosse editado o campo
área fosse actualizado e isso não acontece.

Alguém me sabe dizer o que é que está mal?


CREATE OR REPLACE FUNCTION fun_dimensoes()
  RETURNS trigger AS
$BODY$
DECLARE
tipovarchar(20);
sridinteger;
BEGIN
tipo :=(SELECT type FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND f_table_name = TG_TABLE_NAME);
srid :=(SELECT srid FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND   f_table_name = TG_TABLE_NAME);
-- ponto
IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN
NEW.x = ST_X(NEW.geom);
NEW.y = ST_Y(NEW.geom);
-- linha
ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN
IF (srid = 23030 OR srid = 25830) THEN
NEW.longitude = ST_Length(NEW.geom)::bigint;
ELSIF (srid = 4326) THEN
NEW.longitude = ST_Length(Geography(NEW.geom))::bigint;
END IF;
-- poligono
ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
IF (srid = 23030 OR srid = 25830) THEN
NEW.area = ST_Area(NEW.geom)::bigint;
NEW.perimetro = ST_Perimeter(NEW.geom)::bigint;
ELSIF (srid = 4326) THEN
NEW.area = ST_Area(Geography(NEW.geom))::bigint;
NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint;
END IF;
END IF;
RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Obrigado,

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 17 de Março de 2012 21:39, Matheus de Oliveira 
matioli.math...@gmail.com escreveu:

 Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não
 ter lock aumentam, mas não desaparecem. Analisando por cima suas
 necessidades, não acredito que a melhor solução seja realmente adicionar
 uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
 seja, sempre adicione a coluna (talvez junto com a execução do comando
 CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
 até fazer a verificação e dar um RAISE EXCEPTION caso não exista).

 PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em
 usar herança nessas tabelas para organizar melhor as coisas.

 Atenciosamente,
 --
 Matheus de Oliveira

 Bacharelado em Ciências de Computação
 Laboratório de Computação de Alto Desempenho - 
 LCADhttp://www.lcad.icmc.usp.br/
 Instituto de Ciências Matemáticas e de Computação - 
 ICMChttp://www.icmc.usp.br/
 Universidade de São Paulo - USP http://www.sc.usp.br/





 On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote:

 O melhor será separar esta função em duas:
 A primeira que verifique se os campos existem e se não os criam.
 E a segunda como disparador para que se actualizem com os inserts e
 updates.
 Obrigado pela ajuda!


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel 
 fha...@gmail.com escreveu:

  Cancelando as demais transações/conexões também resolve seu problema
  *se, e somente se* isto não for um problema no seu cenário.

 Minha experiência com DDL dentro de funções é de resultado sempre
 inesperado.
 Se a função é específica para ser executada em horário controlado,
 geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
 executando funções do que comandos mais complexos ou scripts.
 Já se a função é para ser chamada automaticamente por causa de uma
 necessidade de uma aplicação ou usuário, a chance de lock é
 monstruosa, e é o que está ocorrendo com o colega.

 []s
 Flavio Gurgel
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-20 Por tôpico Matheus de Oliveira
A trigger é BEFORE? Caso contrário não atualiza mesmo.


--
Matheus de Oliveira

Bacharelado em Ciências de Computação
Laboratório de Computação de Alto Desempenho -
LCADhttp://www.lcad.icmc.usp.br/
Instituto de Ciências Matemáticas e de Computação -
ICMChttp://www.icmc.usp.br/
Universidade de São Paulo - USP http://www.sc.usp.br/




On Tue, Mar 20, 2012 at 10:57 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote:

 Obrigado a todos pelas vossas dicas.

 Fiz isso, retirei a parte de criação de colunas da função e agora não
 salta nenhum erro.
 No entanto seria de esperar que quando um polígono fosse editado o campo
 área fosse actualizado e isso não acontece.

 Alguém me sabe dizer o que é que está mal?



 CREATE OR REPLACE FUNCTION fun_dimensoes()
   RETURNS trigger AS
 $BODY$
 DECLARE
 tipovarchar(20);
 sridinteger;
 BEGIN
 tipo :=(SELECT type FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND f_table_name = TG_TABLE_NAME);
 srid :=(SELECT srid FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND   f_table_name = TG_TABLE_NAME);
  -- ponto
 IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN
 NEW.x = ST_X(NEW.geom);
 NEW.y = ST_Y(NEW.geom);
 -- linha
 ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN

 IF (srid = 23030 OR srid = 25830) THEN
 NEW.longitude = ST_Length(NEW.geom)::bigint;

 ELSIF (srid = 4326) THEN
 NEW.longitude = ST_Length(Geography(NEW.geom))::bigint;
 END IF;
 -- poligono
 ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN

 IF (srid = 23030 OR srid = 25830) THEN
 NEW.area = ST_Area(NEW.geom)::bigint;
 NEW.perimetro = ST_Perimeter(NEW.geom)::bigint;

 ELSIF (srid = 4326) THEN
 NEW.area = ST_Area(Geography(NEW.geom))::bigint;
 NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint;
 END IF;
 END IF;

 RETURN NEW;
 END;
 $BODY$
   LANGUAGE 'plpgsql' VOLATILE
   COST 100;

 Obrigado,


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 17 de Março de 2012 21:39, Matheus de Oliveira 
 matioli.math...@gmail.com escreveu:

 Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não
 ter lock aumentam, mas não desaparecem. Analisando por cima suas
 necessidades, não acredito que a melhor solução seja realmente adicionar
 uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
 seja, sempre adicione a coluna (talvez junto com a execução do comando
 CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
 até fazer a verificação e dar um RAISE EXCEPTION caso não exista).

 PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em
 usar herança nessas tabelas para organizar melhor as coisas.

 Atenciosamente,
 --
 Matheus de Oliveira

 Bacharelado em Ciências de Computação
 Laboratório de Computação de Alto Desempenho - 
 LCADhttp://www.lcad.icmc.usp.br/
 Instituto de Ciências Matemáticas e de Computação - 
 ICMChttp://www.icmc.usp.br/
 Universidade de São Paulo - USP http://www.sc.usp.br/





 On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote:

 O melhor será separar esta função em duas:
 A primeira que verifique se os campos existem e se não os criam.
 E a segunda como disparador para que se actualizem com os inserts e
 updates.
 Obrigado pela ajuda!


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel 
 fha...@gmail.com escreveu:

  Cancelando as demais transações/conexões também resolve seu problema
  *se, e somente se* isto não for um problema no seu cenário.

 Minha experiência com DDL dentro de funções é de resultado sempre
 inesperado.
 Se a função é específica para ser executada em horário controlado,
 geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
 executando funções do que comandos mais complexos ou scripts.
 Já se a função é para ser chamada automaticamente por causa de uma
 necessidade de uma aplicação ou usuário, a chance de lock é
 monstruosa, e é o que está ocorrendo com o colega.

 []s
 Flavio Gurgel
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 

Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-20 Por tôpico Eloi Ribeiro
Sim, não está bem assim?

CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes
BEFORE INSERT OR UPDATE
ON sch_forestal.postfire_study_area
FOR EACH ROW
EXECUTE PROCEDURE fun_dimensoes();


Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 20 de Março de 2012 15:09, Matheus de Oliveira 
matioli.math...@gmail.com escreveu:

 A trigger é BEFORE? Caso contrário não atualiza mesmo.



 --
 Matheus de Oliveira

 Bacharelado em Ciências de Computação
 Laboratório de Computação de Alto Desempenho - 
 LCADhttp://www.lcad.icmc.usp.br/
 Instituto de Ciências Matemáticas e de Computação - 
 ICMChttp://www.icmc.usp.br/
 Universidade de São Paulo - USP http://www.sc.usp.br/




 On Tue, Mar 20, 2012 at 10:57 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote:

 Obrigado a todos pelas vossas dicas.

 Fiz isso, retirei a parte de criação de colunas da função e agora não
 salta nenhum erro.
 No entanto seria de esperar que quando um polígono fosse editado o campo
 área fosse actualizado e isso não acontece.

 Alguém me sabe dizer o que é que está mal?



 CREATE OR REPLACE FUNCTION fun_dimensoes()
   RETURNS trigger AS
 $BODY$
 DECLARE
 tipovarchar(20);
 sridinteger;
 BEGIN
 tipo :=(SELECT type FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND f_table_name = TG_TABLE_NAME);
 srid :=(SELECT srid FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND   f_table_name = TG_TABLE_NAME);
  -- ponto
 IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN
 NEW.x = ST_X(NEW.geom);
 NEW.y = ST_Y(NEW.geom);
 -- linha
 ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN

 IF (srid = 23030 OR srid = 25830) THEN
 NEW.longitude = ST_Length(NEW.geom)::bigint;

 ELSIF (srid = 4326) THEN
 NEW.longitude = ST_Length(Geography(NEW.geom))::bigint;
 END IF;
 -- poligono
 ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN

 IF (srid = 23030 OR srid = 25830) THEN
 NEW.area = ST_Area(NEW.geom)::bigint;
 NEW.perimetro = ST_Perimeter(NEW.geom)::bigint;

 ELSIF (srid = 4326) THEN
 NEW.area = ST_Area(Geography(NEW.geom))::bigint;
 NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint;
 END IF;
 END IF;

 RETURN NEW;
 END;
 $BODY$
   LANGUAGE 'plpgsql' VOLATILE
   COST 100;

 Obrigado,


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 17 de Março de 2012 21:39, Matheus de Oliveira 
 matioli.math...@gmail.com escreveu:

 Se você passar a trigger para AFTER ao invés de BEFORE suas chances de
 não ter lock aumentam, mas não desaparecem. Analisando por cima suas
 necessidades, não acredito que a melhor solução seja realmente adicionar
 uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
 seja, sempre adicione a coluna (talvez junto com a execução do comando
 CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
 até fazer a verificação e dar um RAISE EXCEPTION caso não exista).

 PS: Caso a trigger seja genérica para várias tabelas, você pode pensar
 em usar herança nessas tabelas para organizar melhor as coisas.

 Atenciosamente,
 --
 Matheus de Oliveira

 Bacharelado em Ciências de Computação
 Laboratório de Computação de Alto Desempenho - 
 LCADhttp://www.lcad.icmc.usp.br/
 Instituto de Ciências Matemáticas e de Computação - 
 ICMChttp://www.icmc.usp.br/
 Universidade de São Paulo - USP http://www.sc.usp.br/





 On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro 
 eloi.ribe...@gmail.comwrote:

 O melhor será separar esta função em duas:
 A primeira que verifique se os campos existem e se não os criam.
 E a segunda como disparador para que se actualizem com os inserts e
 updates.
 Obrigado pela ajuda!


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel 
 fha...@gmail.com escreveu:

  Cancelando as demais transações/conexões também resolve seu problema
  *se, e somente se* isto não for um problema no seu cenário.

 Minha experiência com DDL dentro de funções é de resultado sempre
 inesperado.
 Se a função é específica para ser executada em horário controlado,
 geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
 executando funções do que comandos mais complexos ou scripts.
 Já se a função é para ser chamada automaticamente por causa de uma
 necessidade de uma aplicação ou usuário, a chance de lock é
 monstruosa, e é o que está ocorrendo com o colega.

 []s
 Flavio Gurgel
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 

Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-17 Por tôpico Matheus de Oliveira
Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não
ter lock aumentam, mas não desaparecem. Analisando por cima suas
necessidades, não acredito que a melhor solução seja realmente adicionar
uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
seja, sempre adicione a coluna (talvez junto com a execução do comando
CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
até fazer a verificação e dar um RAISE EXCEPTION caso não exista).

PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em
usar herança nessas tabelas para organizar melhor as coisas.

Atenciosamente,
--
Matheus de Oliveira

Bacharelado em Ciências de Computação
Laboratório de Computação de Alto Desempenho -
LCADhttp://www.lcad.icmc.usp.br/
Instituto de Ciências Matemáticas e de Computação -
ICMChttp://www.icmc.usp.br/
Universidade de São Paulo - USP http://www.sc.usp.br/




On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote:

 O melhor será separar esta função em duas:
 A primeira que verifique se os campos existem e se não os criam.
 E a segunda como disparador para que se actualizem com os inserts e
 updates.
 Obrigado pela ajuda!


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel 
 fha...@gmail.com escreveu:

  Cancelando as demais transações/conexões também resolve seu problema
  *se, e somente se* isto não for um problema no seu cenário.

 Minha experiência com DDL dentro de funções é de resultado sempre
 inesperado.
 Se a função é específica para ser executada em horário controlado,
 geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
 executando funções do que comandos mais complexos ou scripts.
 Já se a função é para ser chamada automaticamente por causa de uma
 necessidade de uma aplicação ou usuário, a chance de lock é
 monstruosa, e é o que está ocorrendo com o colega.

 []s
 Flavio Gurgel
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-16 Por tôpico Flavio Henrique Araque Gurgel
 Cancelando as demais transações/conexões também resolve seu problema
 *se, e somente se* isto não for um problema no seu cenário.

Minha experiência com DDL dentro de funções é de resultado sempre inesperado.
Se a função é específica para ser executada em horário controlado,
geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
executando funções do que comandos mais complexos ou scripts.
Já se a função é para ser chamada automaticamente por causa de uma
necessidade de uma aplicação ou usuário, a chance de lock é
monstruosa, e é o que está ocorrendo com o colega.

[]s
Flavio Gurgel
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-16 Por tôpico Eloi Ribeiro
O melhor será separar esta função em duas:
A primeira que verifique se os campos existem e se não os criam.
E a segunda como disparador para que se actualizem com os inserts e updates.
Obrigado pela ajuda!

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel 
fha...@gmail.com escreveu:

  Cancelando as demais transações/conexões também resolve seu problema
  *se, e somente se* isto não for um problema no seu cenário.

 Minha experiência com DDL dentro de funções é de resultado sempre
 inesperado.
 Se a função é específica para ser executada em horário controlado,
 geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
 executando funções do que comandos mais complexos ou scripts.
 Já se a função é para ser chamada automaticamente por causa de uma
 necessidade de uma aplicação ou usuário, a chance de lock é
 monstruosa, e é o que está ocorrendo com o colega.

 []s
 Flavio Gurgel
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-15 Por tôpico Eloi Ribeiro
Antes de nada obrigada pela vossas respostas.

Efectivamente, Flavio, o esquema tg_table_schema não existe. Só depois
buscando um pouco mais encontrei que tinha de por a sentencia SQL ALTER
TABLE assim:

EXECUTE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';

E de esta maneira já reconhecia o esquema e nome da tabela.

Tiago, com EXECUTE IMMEDIATE da-me um erro de sintasis:

EXECUTE IMMEDIATE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';
ERROR: error de sintaxis en o cerca de «IMMEDIATE»

OK, agora sem o 'IMMEDIATE' a função é criada com êxito mas quando se
executa salta o seguinte erro:

ERROR:  no se puede hacer ALTER TABLE en «postfire_study_area» porque está
siendo usada por consultas activas en esta sesión
CONTEXTO:  sentencia SQL: «ALTER TABLE sch_forestal.postfire_study_
area ADD COLUMN area bigint»

Claro a função dispara quando faço um update ou insert na tabela e tem de
calcular a 'area' e o 'perimetro' para os registos afectados. Mas se estes
campos não existem deveriam ser criados e depois actualizados. O problema
parece ser que não se pode criar os campos tendo a tabela um insert ou
update em curso. Isto é mesmo assim ou existe uma maneira de contornar este
problema?

Obrigado!

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 15 de Março de 2012 00:49, Tiago Adami adam...@gmail.com escreveu:

 Em 12 de março de 2012 07:11, Eloi Ribeiro eloi.ribe...@gmail.com
 escreveu:
  Ola a todos,
 
  Estou a fazer a seguinte função para que me actualize o campo 'area' cada
  vez que exista um INSERT ou UPDATE numa tabela.
  O problema está que o campo 'area' pode não existir e gostava que nesse
 caso
  o campo seja criado e preenchido para todos os registos.
  Como tenho salta-me o erro de que 'Nao existe o esquema
 «tg_table_schema»' e
  não encontro maneira de resolver isso.
  Como faço para adicionar um campo à tabela onde dispara a função e se
  preencha esse campo?

 Se bem entendi, queres adicionar uma coluna à tabela quando ela não
 existir. Já tentou mudar o seu ALTER TABLE explícito por:

 EXECUTE IMMEDIATE 'ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD
 COLUMN area bigint';

 ?

 --
 TIAGO J. ADAMI
 http://www.adamiworks.com
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-15 Por tôpico Tiago Adami
Em 15 de março de 2012 07:19, Eloi Ribeiro eloi.ribe...@gmail.com escreveu:

 ERROR:  no se puede hacer ALTER TABLE en «postfire_study_area» porque está
 siendo usada por consultas activas en esta sesión


A mensagem é clara: não se pode fazer um ALTER TABLE sobre uma tabela
que está sendo utilizada.

Para que o seu ALTER TABLE funcione é necessário encerrar com COMMIT
ou ROLLBACK toda e qualquer transação/conexão que esteja utilizando
esta tabela - exceto a transação/conexão que irá realizar efetivamente
o ALTER TABLE.

Cancelando as demais transações/conexões também resolve seu problema
*se, e somente se* isto não for um problema no seu cenário.

-- 
TIAGO J. ADAMI
http://www.adamiworks.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-14 Por tôpico Eloi Ribeiro
Ola a todos,

Estou a fazer a seguinte função para que me actualize o campo 'area' cada
vez que exista um INSERT ou UPDATE numa tabela.
O problema está que o campo 'area' pode não existir e gostava que nesse
caso o campo seja criado e preenchido para todos os registos.
Como tenho salta-me o erro de que 'Nao existe o esquema «tg_table_schema»'
e não encontro maneira de resolver isso.
Como faço para adicionar um campo à tabela onde dispara a função e se
preencha esse campo?
Sugestões são bem vindas.
Obrigado de ante-mão.

CREATE OR REPLACE FUNCTION fun_dimensoes()
  RETURNS trigger AS
$BODY$
DECLARE
tipovarchar(20);
sridinteger;
BEGIN
tipo = (SELECT type FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND f_table_name = TG_TABLE_NAME);
srid = (SELECT srid FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND   f_table_name = TG_TABLE_NAME);

IF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
IF NOT EXISTS(SELECT column_name FROM information_schema.columns
WHERE table_schema = TG_TABLE_SCHEMA
AND table_name = TG_TABLE_NAME
AND column_name='area') THEN
*ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD COLUMN area
bigint;*
IF (srid = 23030 OR srid = 25830) THEN
*UPDATE TG_TABLE_SCHEMA.TG_TABLE_NAME SET area =
ST_Area(geom)::bigint;*
ELSIF (srid = 4326) THEN
*UPDATE TG_TABLE_SCHEMA.TG_TABLE_NAME SET area =
ST_Area(Geography(geom))::bigint;*
END IF;
ELSE
IF (srid = 23030 OR srid = 25830) THEN
NEW.area = ST_Area(NEW.geom)::bigint;
ELSIF (srid = 4326) THEN
NEW.area = ST_Area(Geography(NEW.geom))::bigint;
END IF;
END IF;
END IF;

RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes
BEFORE INSERT OR UPDATE
ON sch_forestal.postfire_study_area
FOR EACH ROW
EXECUTE PROCEDURE fun_dimensoes();

Quando edito a geometria salta o seguinte erro:

ERROR:  no existe el esquema «tg_table_schema»
CONTEXTO:  sentencia SQL: «ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD
COLUMN area bigint»


Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-14 Por tôpico Flavio Henrique Araque Gurgel
 Quando edito a geometria salta o seguinte erro:

 ERROR:  no existe el esquema «tg_table_schema»
 CONTEXTO:  sentencia SQL: «ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD
 COLUMN area bigint»

O erro é claro (embora em espanhol, língua que não domino):
Não existe o esquema tg_table_schema.
Existe um esquema com esse nome?
A tabela está dentro do esquema certo?

[]s
Flavio Gurgel
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-14 Por tôpico Tiago Adami
Em 12 de março de 2012 07:11, Eloi Ribeiro eloi.ribe...@gmail.com escreveu:
 Ola a todos,

 Estou a fazer a seguinte função para que me actualize o campo 'area' cada
 vez que exista um INSERT ou UPDATE numa tabela.
 O problema está que o campo 'area' pode não existir e gostava que nesse caso
 o campo seja criado e preenchido para todos os registos.
 Como tenho salta-me o erro de que 'Nao existe o esquema «tg_table_schema»' e
 não encontro maneira de resolver isso.
 Como faço para adicionar um campo à tabela onde dispara a função e se
 preencha esse campo?

Se bem entendi, queres adicionar uma coluna à tabela quando ela não
existir. Já tentou mudar o seu ALTER TABLE explícito por:

EXECUTE IMMEDIATE 'ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD
COLUMN area bigint';

?

-- 
TIAGO J. ADAMI
http://www.adamiworks.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-14 Por tôpico Eloi Ribeiro
Bem, já consegui alguns progressos com a função.
No entanto tenho o seguinte erro:

ERROR:  no se puede hacer ALTER TABLE en «postfire_study_area» porque está
siendo usada por consultas activas en esta sesión
CONTEXTO:  sentencia SQL: «ALTER TABLE sch_forestal.postfire_study_area ADD
COLUMN area bigint»

Fiz as seguintes alterações:



 CREATE OR REPLACE FUNCTION fun_dimensoes()
   RETURNS trigger AS
 $BODY$
 DECLARE


esquemavarchar(20);
tabelavarchar(50);


 tipovarchar(20);
 sridinteger;
 BEGIN


esquema := TG_TABLE_SCHEMA;
tabela:= TG_TABLE_NAME;


 tipo := (SELECT type FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND f_table_name = TG_TABLE_NAME);
 srid := (SELECT srid FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND   f_table_name = TG_TABLE_NAME);

 IF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
 IF NOT EXISTS(SELECT column_name FROM information_schema.columns
 WHERE table_schema = TG_TABLE_SCHEMA
 AND table_name = TG_TABLE_NAME
 AND column_name='area') THEN


EXECUTE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';


 IF (srid = 23030 OR srid = 25830) THEN


EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) ||
' SET area = ST_Area(geom)::bigint';


 ELSIF (srid = 4326) THEN


EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) ||
' SET area = ST_Area(Geography(geom))::bigint';


 END IF;
 ELSE
 IF (srid = 23030 OR srid = 25830) THEN
 NEW.area = ST_Area(NEW.geom)::bigint;
 ELSIF (srid = 4326) THEN
 NEW.area = ST_Area(Geography(NEW.geom))::bigint;
 END IF;
 END IF;
 END IF;

 RETURN NEW;
 END;
 $BODY$
   LANGUAGE 'plpgsql' VOLATILE
   COST 100;

 CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes
 BEFORE INSERT OR UPDATE
 ON sch_forestal.postfire_study_area
 FOR EACH ROW
 EXECUTE PROCEDURE fun_dimensoes();

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] AJUDA COM FUNÇÃO

2010-04-07 Por tôpico Mozart Hasse
Olá Jose,

Fuçando um pouco fora da limitada documentação do PostgreSQL, em versões
anteriores à 8.4, pode-se converter o tipo ctid para um tipo utilizável
através da função tidout() e mais algumas gambiarras.

O código-raimunda equivalente ao que passei, que assim codificado funciona em
versões anteriores do PostgreSQL fica:

select * 
from SUATABELA
where (
cast(
  substring(
  encode(cstring_send(tidout(ctid)),'escape'),
  2,
  position(',' in rtrim( encode(cstring_send(tidout(ctid)),'escape') ))-2 )
  as int) * 199+
cast(
  substring(
  encode(cstring_send(tidout(ctid)),'escape'),
  position(',' in encode(cstring_send(tidout(ctid)),'escape'))+1,
  length(rtrim(encode(cstring_send(tidout(ctid)),'escape'))) - position(',' in
encode(cstring_send(tidout(ctid)),'escape'))-1 )
  as int) )
% 10=1


Atenciosamente,

Mozart Hasse


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] AJUDA COM FUNÇÃO

2010-04-06 Por tôpico Jose Luis Ramos
Bom dia ! Estou retomando este trabalho e tenho algumas dúvidas. Obrigado.

1) Tentei executar o insert as select que voce me passou e está dando o
seguinte erro:
cdrger=# \i insert.sql
psql:insert.sql:18: ERRO:  não pode converter tipo tid para character
varying

O que significa o ctid ? Será que é isso que ele está reclamando ? Estou
executando isso:

insert into TESTE
select *
from cdrger20090319
where (
cast(
 substring(
 cast(ctid as varchar(20)),
 2,
 position(',' in cast(ctid as varchar(20)))-2 )
 as int) * 199+
cast(
 substring(
 cast(ctid as varchar(20)),
 position(',' in cast(ctid as varchar(20)))+1,
 length(rtrim(cast(ctid as varchar(20 -
position(',' in cast(ctid as
varchar(20)))-1 )
 as int) )
% 10=1

2) Como eu faria um loop para fazer esse insert para cada uma das tabelas
cdrger* da minha base ? Por exemplo, na base que estou testando tenho as
tabelas abaixo. Quando for executar o script numa base qualquer poderei ter
n tabelas do tipo cdger*. O objetivo é gerar um dump ou algo do tipo com
10% dos dados (ou x%) para cada uma das tabelas e depois tenho que
importar essas tabelas reduzidas numa base que estará em um notebook da
área comercial e estas devem ter o mesmo nome das tabelas de origem.

cdrger=# \dt
 Lista de relações
 Esquema |  Nome  |  Tipo  |   Dono
-+++--
 public  | cdrger20090220 | tabela | postgres
 public  | cdrger20090228 | tabela | postgres
 public  | cdrger20090301 | tabela | postgres
 public  | cdrger20090303 | tabela | postgres
 public  | cdrger20090305 | tabela | postgres
 public  | cdrger20090311 | tabela | postgres
 public  | cdrger20090312 | tabela | postgres
 public  | cdrger20090313 | tabela | postgres
 public  | cdrger20090314 | tabela | postgres
 public  | cdrger20090315 | tabela | postgres
 public  | cdrger20090316 | tabela | postgres
 public  | cdrger20090317 | tabela | postgres
 public  | cdrger20090318 | tabela | postgres
 public  | cdrger20090319 | tabela | postgres
 public  | cdrger20090320 | tabela | postgres
 public  | teste  | tabela | postgres
(16 registros)



Em 23 de março de 2010 14:25,
pgbr-geral-requ...@listas.postgresql.org.brescreveu:

 Send pgbr-geral mailing list submissions to
pgbr-geral@listas.postgresql.org.br

 To subscribe or unsubscribe via the World Wide Web, visit

 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 or, via email, send a message with subject or body 'help' to
pgbr-geral-requ...@listas.postgresql.org.br

 You can reach the person managing the list at
pgbr-geral-ow...@listas.postgresql.org.br

 When replying, please edit your Subject line so it is more specific
 than Re: Contents of pgbr-geral digest...

 Tópicos de Hoje:

   1. Re: Tutoriais para aprender a fazer queries usandoLatitudes
  e Longitudes? (George Silva)
   2. Re: Tutoriais para aprender a fazer queries usandoLatitudes
  e Longitudes? (Andre Lopes)
   3. Re: AJUDA COM FUNÇÃO (Mozart Hasse)
   4. Re: Como configurar e conectar o PHPpgAdmin? (JotaComm)
   5. Re: Raid 10 (JotaComm)
   6. Re: AJUDA COM FUNÇÃO (pgplsql) (JotaComm)


 -- Mensagem encaminhada --
 From: Mozart Hasse mozart.ha...@usa.net
 To: pgbr-geral@listas.postgresql.org.br
 Date: Tue, 23 Mar 2010 13:19:20 -0300
 Subject: Re: [pgbr-geral] AJUDA COM FUNÇÃO
 Oi Jose,

 Para pegar aproximadamente 1 de cada 10 registros da sua tabela, faça o
 seguinte:

 --insert into ONDEVOCEQUISER
 select *
 from SUATABELA
 where (
 cast(
  substring(
  cast(ctid as varchar(20)),
  2,
  position(',' in cast(ctid as varchar(20)))-2 )
  as int) * 199+
 cast(
  substring(
  cast(ctid as varchar(20)),
  position(',' in cast(ctid as varchar(20)))+1,
  length(rtrim(cast(ctid as varchar(20 - position(',' in cast(ctid as
 varchar(20)))-1 )
  as int) )
 % 10=1

 Troque o 10 da última linha pela taxa de amostragem que te convier.
 (Sim, eu também sinto uma falta desgraçada do rowid do Oracle)
 Devido ao tamanho dos registros influenciarem na distribuição dos ctids,
 você pode não ter *exatamente* 10% dos registros no caso acima (apesar de
 eu
 duvidar que a margem de erro tire teu sono). Isso pode ser minimizado
 rodando
 um vacuum full antes da exportação ou escolhendo outro primo no lugar do
 199
 que seja mais próximo do número de registros por bloco da tabela desejada.

 Atenciosamente,

 Mozart Hasse

 -- Mensagem encaminhada --
 From: JotaComm jota.c...@gmail.com
 To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br
 Date: Tue, 23 Mar 2010 14:08:16 -0300
 Subject: Re: [pgbr-geral] AJUDA COM FUNÇÃO (pgplsql)
 Olá,

 Em 23 de março de 2010 11:28, Jose Luis Ramos

Re: [pgbr-geral] AJUDA COM FUNÇÃO

2010-04-06 Por tôpico Mozart Hasse
Olá Jose,

 Bom dia ! Estou retomando este trabalho e tenho algumas dúvidas. Obrigado.
 1) Tentei executar o insert as select que voce me passou e está dando o
 seguinte erro:
 cdrger=# \i insert.sql
 psql:insert.sql:18: ERRO:  não pode converter tipo tid para character
 varying

Puuutz, de fato, não funciona em versões anteriores do PostgreSQL. Eu te
passei o que funcionou na 8.4.3, não sei a partir de que versão foi colocado
esse CAST. Não tenho sugestão de jeito fácil de fazer isso em versões
anteriores.

 O que significa o ctid ? Será que é isso que ele está reclamando ? Estou
 executando isso:

ctid é um identificador único do registro dentro da tabela, composto por 2
números. O que o fragmento que passei faz é transformar os dois num número
único e tirar o resto da divisão para ter uma distribuição meio
aleatória.

Atenciosamente,

Mozart Hasse


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] AJUDA COM FUNÇÃO

2010-04-06 Por tôpico Osvaldo Kussama
Em 6 de abril de 2010 13:41, Mozart Hasse mozart.ha...@usa.net escreveu:
 Olá Jose,

 Bom dia ! Estou retomando este trabalho e tenho algumas dúvidas. Obrigado.
 1) Tentei executar o insert as select que voce me passou e está dando o
 seguinte erro:
 cdrger=# \i insert.sql
 psql:insert.sql:18: ERRO:  não pode converter tipo tid para character
 varying

 Puuutz, de fato, não funciona em versões anteriores do PostgreSQL. Eu te
 passei o que funcionou na 8.4.3, não sei a partir de que versão foi colocado
 esse CAST. Não tenho sugestão de jeito fácil de fazer isso em versões
 anteriores.

 O que significa o ctid ? Será que é isso que ele está reclamando ? Estou
 executando isso:

 ctid é um identificador único do registro dentro da tabela, composto por 2
 números. O que o fragmento que passei faz é transformar os dois num número
 único e tirar o resto da divisão para ter uma distribuição meio
 aleatória.



Verifique se funciona:

bdteste=# SELECT ctid, (substring(ctid::text, 2, position(',' in
ctid::text)-2 )::int) * 199 + (substring(ctid::text, position(',' in
ctid::text)+1, length(rtrim(ctid::text)) - position(',' in
ctid::text)-1 )::int) FROM foo;
 ctid  | ?column?
---+--
 (0,1) |1
 (0,2) |2
 (0,3) |3
 (0,4) |4
(4 registros)

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] AJUDA COM FUNÇÃO (pgplsql)

2010-03-23 Por tôpico Jose Luis Ramos
Gostaria de uma ajuda no seguinte: tenho várias tabelas com o mesmo prefixo:

cdrger=# \dt
 Lista de relações
 Esquema |  Nome  |  Tipo  |   Dono
-+++--
 public  | cdrger20090227 | tabela | postgres
 public  | cdrger20090306 | tabela | postgres
 public  | cdrger20090311 | tabela | postgres
 public  | cdrger20090319 | tabela | postgres
 public  | cdrger20090320 | tabela | postgres
 public  | cdrger20090324 | tabela | postgres
 public  | cdrger20090325 | tabela | postgres
 public  | cdrger20090326 | tabela | postgres
 public  | cdrger20090327 | tabela | postgres
 public  | cdrger20090328 | tabela | postgres
 public  | cdrger20090329 | tabela | postgres
 public  | cdrger20090330 | tabela | postgres
(12 registros)

Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo
(cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma
tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim
por diante. O objetivo é gerar uma base menor que a base que estou lendo.
Depois tenho que exportar essa ou essas tabelas temp geradas e importar em
uma base de um notebook para ser utilizada pela área comercial da empresa.
Se alguém puder me ajudar eu agradeço. Conheço Oracle, mas estou começando
com PostgreSQL esta semana ... Obrigado.

-- 
Jose Luis Ramos Jr
Campinas - SP
Oracle OCP DBA 8i, 9i,10g
Fone: 19-37056793
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] AJUDA COM FUNÇÃO

2010-03-23 Por tôpico Mozart Hasse
Oi Jose,

Para pegar aproximadamente 1 de cada 10 registros da sua tabela, faça o
seguinte:

--insert into ONDEVOCEQUISER
select * 
from SUATABELA
where (
cast(
  substring(
  cast(ctid as varchar(20)),
  2,
  position(',' in cast(ctid as varchar(20)))-2 )
  as int) * 199+
cast(
  substring(
  cast(ctid as varchar(20)),
  position(',' in cast(ctid as varchar(20)))+1,
  length(rtrim(cast(ctid as varchar(20 - position(',' in cast(ctid as
varchar(20)))-1 )
  as int) )
% 10=1

Troque o 10 da última linha pela taxa de amostragem que te convier.
(Sim, eu também sinto uma falta desgraçada do rowid do Oracle)
Devido ao tamanho dos registros influenciarem na distribuição dos ctids,
você pode não ter *exatamente* 10% dos registros no caso acima (apesar de eu
duvidar que a margem de erro tire teu sono). Isso pode ser minimizado rodando
um vacuum full antes da exportação ou escolhendo outro primo no lugar do 199
que seja mais próximo do número de registros por bloco da tabela desejada.

Atenciosamente,

Mozart Hasse

 From: Jose Luis Ramos jose.ramos.caj...@gmail.com
 Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo
 (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma
 tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e
assim
 por diante. O objetivo é gerar uma base menor que a base que estou lendo.




___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] AJUDA COM FUNÇÃO (pgplsql)

2010-03-23 Por tôpico JotaComm
Olá,

Em 23 de março de 2010 11:28, Jose Luis Ramos
jose.ramos.caj...@gmail.comescreveu:

 Gostaria de uma ajuda no seguinte: tenho várias tabelas com o mesmo
 prefixo:

 cdrger=# \dt
  Lista de relações
  Esquema |  Nome  |  Tipo  |   Dono
 -+++--
  public  | cdrger20090227 | tabela | postgres
  public  | cdrger20090306 | tabela | postgres
  public  | cdrger20090311 | tabela | postgres
  public  | cdrger20090319 | tabela | postgres
  public  | cdrger20090320 | tabela | postgres
  public  | cdrger20090324 | tabela | postgres
  public  | cdrger20090325 | tabela | postgres
  public  | cdrger20090326 | tabela | postgres
  public  | cdrger20090327 | tabela | postgres
  public  | cdrger20090328 | tabela | postgres
  public  | cdrger20090329 | tabela | postgres
  public  | cdrger20090330 | tabela | postgres
 (12 registros)

 Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo
 (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma
 tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim
 por diante. O objetivo é gerar uma base menor que a base que estou lendo.
 Depois tenho que exportar essa ou essas tabelas temp geradas e importar em
 uma base de um notebook para ser utilizada pela área comercial da empresa.
 Se alguém puder me ajudar eu agradeço. Conheço Oracle, mas estou começando
 com PostgreSQL esta semana ... Obrigado.


Fiquei confuso. Acho que um exemplo facilitaria o entendimento.


 --
 Jose Luis Ramos Jr
 Campinas - SP
 Oracle OCP DBA 8i, 9i,10g
 Fone: 19-37056793

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



[]s
-- 
JotaComm
http://jotacomm.wordpress.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] AJUDA COM FUNÇÃO (pgplsql)

2010-03-23 Por tôpico Osvaldo Kussama
Em 23 de março de 2010 11:28, Jose Luis Ramos
jose.ramos.caj...@gmail.com escreveu:
 Gostaria de uma ajuda no seguinte: tenho várias tabelas com o mesmo prefixo:

 cdrger=# \dt
  Lista de relações
  Esquema |  Nome  |  Tipo  |   Dono
 -+++--
  public  | cdrger20090227 | tabela | postgres
  public  | cdrger20090306 | tabela | postgres
  public  | cdrger20090311 | tabela | postgres
  public  | cdrger20090319 | tabela | postgres
  public  | cdrger20090320 | tabela | postgres
  public  | cdrger20090324 | tabela | postgres
  public  | cdrger20090325 | tabela | postgres
  public  | cdrger20090326 | tabela | postgres
  public  | cdrger20090327 | tabela | postgres
  public  | cdrger20090328 | tabela | postgres
  public  | cdrger20090329 | tabela | postgres
  public  | cdrger20090330 | tabela | postgres
 (12 registros)

 Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo
 (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma
 tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim
 por diante. O objetivo é gerar uma base menor que a base que estou lendo.
 Depois tenho que exportar essa ou essas tabelas temp geradas e importar em
 uma base de um notebook para ser utilizada pela área comercial da empresa.
 Se alguém puder me ajudar eu agradeço. Conheço Oracle, mas estou começando
 com PostgreSQL esta semana ... Obrigado.



Tente uma função do tipo:

CREATE OR REPLACE FUNCTION sua_função(prefixo text) RETURNS void AS $$
DECLARE
   tabela text;
   novatabela text;
   n int;
BEGIN
   FOR tabela IN EXECUTE 'SELECT table_name FROM
information_schema.tables WHERE table_name LIKE ' || prefixo || '%'
LOOP
  novatabela = 'novoprefixo' || substring(tabela,7);
  EXECUTE 'CREATE TABLE ' || novatabela || 'AS SELECT * FROM ' ||
tabela || ' WITH NO DATA';
  EXECUTE 'SELECT count(*)/10 FROM ' || tabela INTO n;
  FOR i = 1 to n LOOP
 EXECUTE 'INSERT INTO ' || novatabela || ' SELECT * FROM ' ||
tabela || ' LIMIT 1 OFFSET ' || (i-1)*10::text;
  END LOOP;
   END LOOP;
   RETURN;
END;
$$ LANGUAGE plpgsql;

Osvaldo
PS.: Não testada
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Ajuda com função

2009-07-09 Por tôpico Rudinei Dias
Pessoal,

Já dei uma olhada nas mensagens do fórum, sei que vi algo relativo a isto aqui.

Preciso que o retorno de uma função retorne mais de um valor dentro de
uma sql, tipo retorno multi-coluna.
Já tentei vetores também, mas o retorno é uma estrutura textual dentro do campo.

ex. select xy();
resultado
coluna A  |  coluna B
   |  d

Eu tava 'nas idéia' com crosstab mas não é isso...
a idade já não ajuda mais... não consigo me lembrar...

Alguém recorda como fazer?

Desde já agradeço

-- 
-
Rudinei Dias
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2009-07-09 Por tôpico Rafael Domiciano
Eu faço isso com a function retornando um type... funciona direitinho...:
CREATE TYPE typ_teste
( codigo integer, texto, text);

CREATE FUNCTION fnc_teste() RETURNS setof typ_teste

Acho que da pra fazer com out tb
create function fnc_teste (out, out)

2009/7/9 Rudinei Dias rudinei.d...@gmail.com

 Pessoal,

 Já dei uma olhada nas mensagens do fórum, sei que vi algo relativo a isto
 aqui.

 Preciso que o retorno de uma função retorne mais de um valor dentro de
 uma sql, tipo retorno multi-coluna.
 Já tentei vetores também, mas o retorno é uma estrutura textual dentro do
 campo.

 ex. select xy();
 resultado
 coluna A  |  coluna B
    |  d

 Eu tava 'nas idéia' com crosstab mas não é isso...
 a idade já não ajuda mais... não consigo me lembrar...

 Alguém recorda como fazer?

 Desde já agradeço

 --
 -
 Rudinei Dias
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-04 Por tôpico Luiz Rafael Culik Guimaraes
Ola



O que estou fazendo e saindo dele ( sqlrdd ) para trabalhar nativamente
com o Postgres.

nao precisa fazer isso
o sqlrdd acessa o banco direto por queries tambem
e nao precisa desse tipo de gambiarra para acessar os dados

[]s
Luiz
www.xharbour.com.br

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-03 Por tôpico Luiz Rafael Culik Guimaraes
Ola tetraetila

Vc esta  utilizando o sqlrdd do xharbour.com correto.

se sim nao e necessario fazer o que vc esta tentando

o sqlrdd e bem inteligente quando a bloqueios de arquivos

[]s
Luiz
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-03 Por tôpico tetraetila®
Vou verificar isto agora, muito obrigado novamente...

Adilson




- Original Message - 
From: Osvaldo Kussama [EMAIL PROTECTED]
To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br
Sent: Saturday, November 01, 2008 6:23 PM
Subject: Re: [pgbr-geral] Ajuda com função


Adilson:

Pelo visto você continua tentando trabalhar com bloqueios de registros.
Já foi dito anteriormente, e vou insistir novamente: dê uma estudada
na maneira como o PostgreSQL trabalha (particularmente MVCC [1]) pois
é bem diferente da maneira com que um dbf trabalha.

Osvaldo

[1] http://pgdocptbr.sourceforge.net/pg80/mvcc.html#MVCC-INTRO
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral 

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-03 Por tôpico tetraetila®
Valeu Osvaldo,

Muito obrigado, vou testar.

Adilson
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-01 Por tôpico tetraetila®
- Original Message - 
From: Osvaldo Kussama [EMAIL PROTECTED]
To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br
Sent: Friday, October 31, 2008 9:07 PM
Subject: Re: [pgbr-geral] Ajuda com função

  select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p
  WHERE p.locked_row = a.ctid order by sr_recno;

 Não deu para entender o que você quer fazer.
 Vejamos:
 - innermyst é uma string que contém o comando SQL que você desja executar.
 - myrec é um record contendo todos os campos resultantes da junção da
 - tabela $1 com a tabela pgrowlocks.
 - você concatena a string com o record (sinceramente não sei qual o
 resultado) e tenta executar?

Osvaldo
___

Nem eu?   : - )

Caro Osvaldo

Ela precisa me retornar o resultado como se eu tivesse feito este select:

select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p
WHERE p.locked_row = a.ctid order by sr_recno;

Ao invés dele passo a usar: select colunas( 'a003.a003015_tbl' );

Fiz umas modificações, vide abaixo. Ao executar recebo o erro:

ERROR: set-valued function called in context that cannot accept a set
CONTEXT: PL/pgSQL function colunas while casting return value to
function's return type.

Obrigado!

Adilson



/* MODIFICADA - MODIFICADA - MODIFICADA /*

 -- Function: colunas(text)

 -- DROP FUNCTION colunas(text);

 CREATE OR REPLACE FUNCTION colunas( text )
   RETURNS SETOF record AS
 $BODY$
 DECLARE
   myrec RECORD;
   myst TEXT;
 BEGIN
   myst = 'select * FROM '||$1||' as a, pgrowlocks('||quote_literal($1)||')
AS p WHERE p.locked_row = a.ctid order by sr_recno';
   FOR myrec IN EXECUTE myst LOOP
  BEGIN
EXECUTE myst;
EXCEPTION WHEN lock_not_available THEN
RETURN NEXT myrec;
  END;
   END LOOP;
   RETURN;
 END;

 $BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT
COST 100
ROWS 1000;
 ALTER FUNCTION colunas(text) OWNER TO postgres;
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-01 Por tôpico Osvaldo Kussama
Em 01/11/08, tetraetila(R)[EMAIL PROTECTED] escreveu:
 - Original Message -
 From: Osvaldo Kussama [EMAIL PROTECTED]

 Não deu para entender o que você quer fazer.
 Vejamos:
 - innermyst é uma string que contém o comando SQL que você desja executar.
 - myrec é um record contendo todos os campos resultantes da junção da
 - tabela $1 com a tabela pgrowlocks.
 - você concatena a string com o record (sinceramente não sei qual o
 resultado) e tenta executar?

 Osvaldo
 ___

 Nem eu?   : - )

 Caro Osvaldo

 Ela precisa me retornar o resultado como se eu tivesse feito este select:

 select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p
 WHERE p.locked_row = a.ctid order by sr_recno;

 Ao invés dele passo a usar: select colunas( 'a003.a003015_tbl' );



Para fazer exatamente oque o SELECT acima faz, mas passando a tabela,
teste a função:

CREATE OR REPLACE FUNCTION colunas(text)
   RETURNS SETOF record AS
$$
 DECLARE
   myrec RECORD;
   myst TEXT;
 BEGIN
   myst = 'select * FROM ' || $1 ||
  ' as a, pgrowlocks(' || quote_literal($1) ||
  ') AS p WHERE p.locked_row = a.ctid order by sr_recno';
   FOR myrec IN EXECUTE myst LOOP
RETURN NEXT myrec;
   END LOOP;
   RETURN;
 END;
$$ LANGUAGE 'plpgsql' VOLATILE STRICT;

Para usar utilize:
SELECT * FROM colunas('sua_tabela') AS foo(lista de tipo de campos de
sua_tabela + lista de tipo de campos de pg_rowlocks);

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-01 Por tôpico Osvaldo Kussama
Adilson:

Pelo visto você continua tentando trabalhar com bloqueios de registros.
Já foi dito anteriormente, e vou insistir novamente: dê uma estudada
na maneira como o PostgreSQL trabalha (particularmente MVCC [1]) pois
é bem diferente da maneira com que um dbf trabalha.

Osvaldo

[1] http://pgdocptbr.sourceforge.net/pg80/mvcc.html#MVCC-INTRO
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Ajuda com função

2008-10-31 Por tôpico tetraetila®
Pessoal

Este select abaixo funciona da forma que eu quero, ele me retorna os campos que 
estão bloqueados na tabela, Ok!
Gostaria de fazer uma função com ele.


select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p WHERE 
p.locked_row = a.ctid order by sr_recno;


Com base em uma função que achei no Google estou tentando adaptar o select 
acima para a função abaixo, não sei 
a linguagem plpgsql e estou estudando o Postgres, gostaria da ajuda de vocês 
para fazê-la funcionar.

Muito obrigado, segue abaixo a função que estou tentando adaptar. Perdoem os 
erros! :- )

Adilson

/*

Retirada em parte da função CREATE OR REPLACE FUNCTION 
whichrowslocked(text,text)
encontrada no Google.

/*


-- Function: colunas(text)

-- DROP FUNCTION colunas(text);

CREATE OR REPLACE FUNCTION colunas(text)
  RETURNS SETOF RECORD AS
$BODY$
DECLARE
  myrec RECORD;
  myst TEXT;
  innermyst TEXT;
BEGIN
  innermyst = 'select * FROM '||$1||' as a, pgrowlocks('||quote_literal($1)||') 
AS p WHERE p.locked_row = a.ctid order by sr_recno';
  FOR myrec IN EXECUTE innermyst LOOP
 myst = innermyst||myrec;
 BEGIN
   EXECUTE myst;
   EXCEPTION WHEN lock_not_available THEN
   RETURN NEXT myrec;
 END;
  END LOOP;
  RETURN;
END;

$BODY$
   LANGUAGE 'plpgsql' VOLATILE STRICT
   COST 100
   ROWS 1000;
ALTER FUNCTION colunas(text) OWNER TO postgres;
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-10-31 Por tôpico Osvaldo Kussama
Em 31/10/08, tetraetila(R)[EMAIL PROTECTED] escreveu:

 Este select abaixo funciona da forma que eu quero, ele me retorna os campos
 que estão bloqueados na tabela, Ok!
 Gostaria de fazer uma função com ele.


 select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p
 WHERE p.locked_row = a.ctid order by sr_recno;


 Com base em uma função que achei no Google estou tentando adaptar o select
 acima para a função abaixo, não sei
 a linguagem plpgsql e estou estudando o Postgres, gostaria da ajuda de vocês
 para fazê-la funcionar.

 Muito obrigado, segue abaixo a função que estou tentando adaptar. Perdoem os
 erros! :- )

 Adilson

 /*

 Retirada em parte da função CREATE OR REPLACE FUNCTION
 whichrowslocked(text,text)
 encontrada no Google.

 /*


 -- Function: colunas(text)

 -- DROP FUNCTION colunas(text);

 CREATE OR REPLACE FUNCTION colunas(text)
   RETURNS SETOF RECORD AS
 $BODY$
 DECLARE
   myrec RECORD;
   myst TEXT;
   innermyst TEXT;
 BEGIN
   innermyst = 'select * FROM '||$1||' as a,
 pgrowlocks('||quote_literal($1)||') AS p WHERE p.locked_row = a.ctid order
 by sr_recno';
   FOR myrec IN EXECUTE innermyst LOOP
  myst = innermyst||myrec;
  BEGIN
EXECUTE myst;
EXCEPTION WHEN lock_not_available THEN
RETURN NEXT myrec;
  END;
   END LOOP;
   RETURN;
 END;

 $BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT
COST 100
ROWS 1000;
 ALTER FUNCTION colunas(text) OWNER TO postgres;



Não deu para entender o que você quer fazer.
Vejamos:
- innermyst é uma string que contém o comando SQL que você desja executar.
- myrec é um record contendo todos os campos resultantes da junção da
tabela $1 com a tabela pgrowlocks.
- você concatena a string com o record (sinceramente não sei qual o
resultado) e tenta executar?

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Ajuda com Função Incrementar Mes ..

2008-10-15 Por tôpico Tatu
Necessito numa função, entrar com um data e um numero enteiro no segundo
parametro que é a quantidade de meses a somar e retorna uma data...
sei que existe a funcao date + interval ' x month'  mas nao estou
conseguindo implementar esse x como uma variável.
Ficaria grato se alguem me desse uma dica.
 
Santiago
NSR Informática.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função Incrementar Mes ..

2008-10-15 Por tôpico Fábio Telles Rodriguez
2008/10/15 Tatu [EMAIL PROTECTED]

  Necessito numa função, entrar com um data e um numero enteiro no segundo
 parametro que é a quantidade de meses a somar e retorna uma data...
 sei que existe a funcao date + interval ' x month'  mas nao estou
 conseguindo implementar esse x como uma variável.
 Ficaria grato se alguem me desse uma dica.



Você pode mostrar a sua consulta?


[]s


 Santiago
 NSR Informática.

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função Incrementar Mes ..

2008-10-15 Por tôpico Osvaldo Kussama
2008/10/15, Tatu [EMAIL PROTECTED]:
 Necessito numa função, entrar com um data e um numero enteiro no segundo
 parametro que é a quantidade de meses a somar e retorna uma data...
 sei que existe a funcao date + interval ' x month'  mas nao estou
 conseguindo implementar esse x como uma variável.
 Ficaria grato se alguem me desse uma dica.



Tente:

   sua_data + num_meses*'1 month'::interval

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função Incrementar Mes ..

2008-10-15 Por tôpico Jota
Olá, Tatu

Segue abaixo uma função. Poderia verificar se é isso que você precisa.

CREATE OR REPLACE FUNCTION soma_data(date,integer)
RETURNS date AS $soma_data$
SELECT $1+$2;
$soma_data$ LANGUAGE SQL IMMUTABLE;

SELECT soma_data('2008-10-13',20); //chamando a função

ou ainda de uma forma mais simples:

SELECT current_date + 10;

ou

SELECT '2008-10-15'::date + 13;

ou

SELECT '2008-10-15'::date + interval '13 days'; (assim apresenta a
data e a hora, porém a hora é truncada em 00:00:00).

Se quiser descartar a data pode usar a função to_char.

Espero ter ajudado.

[]s





2008/10/15 Tatu [EMAIL PROTECTED]:
 Necessito numa função, entrar com um data e um numero enteiro no segundo
 parametro que é a quantidade de meses a somar e retorna uma data...
 sei que existe a funcao date + interval ' x month'  mas nao estou
 conseguindo implementar esse x como uma variável.
 Ficaria grato se alguem me desse uma dica.

 Santiago
 NSR Informática.
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral





-- 
João Paulo
www.dextra.com.br/postgres
PostgreSQL
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função Incrementar Mes ..

2008-10-15 Por tôpico Leonardo Cezar
2008/10/15 Tatu [EMAIL PROTECTED]:
 Necessito numa função, entrar com um data e um numero enteiro no segundo
 parametro que é a quantidade de meses a somar e retorna uma data...

$ PREPARE incrementador_de_dias(date,integer) AS SELECT $1 + $2;
$ EXECUTE incrementador_dedias(CURRENT_DATE,30);

 sei que existe a funcao date + interval ' x month'  mas nao estou
 conseguindo implementar esse x como uma variável.

Envie a forma como está tentando implementar para facilitar um pouco.

-Leo
-- 
Leonardo Cezar
http://pgcon.postgresql.org.br
http://www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral