Pessoal,

Dentro de uma função, pode-se aproveitar todos os comandos de timestamp que
o PG oferece. Se quisermos saber o momento em que a transação iniciou,
podemos consultar a *transaction_timestamp()*, mesmo que seja o último
comando do bloco. Ela retorna sempre o mesmo valor. Se quisermos saber a
hora exata,*clock_timestamp()*, que até dentro do mesmo comando retorna
valores diferentes. Segundo o manual do PG, o *statement_timestamp()* e o *
transaction_timestamp()*podem até retornar o mesmo valor logo no início de
uma transação, mas serão diferentes a cada novo comando executado. Sendo
assim, eu criei uma função pra testar:


CREATE OR REPLACE FUNCTION "geral"."fn_tempo_funcao"()

RETURNS bigint

AS

$BODY$

DECLARE
    x bigint;

BEGIN
    perform pg_sleep(5);
    raise notice 'Transaction: %', transaction_timestamp();
    raise notice 'Statement  : %', statement_timestamp();
    raise notice '---------------------------------------';

    perform pg_sleep(5);
    raise notice 'Transaction: %', transaction_timestamp();
    raise notice 'Statement  : %', statement_timestamp();
    raise notice '---------------------------------------';

    begin
    select count(*) into x from farm.input_cnpj;

    perform pg_sleep(5);

    raise notice 'Transaction: %', transaction_timestamp();
    raise notice 'Statement  : %', statement_timestamp();
    raise notice '---------------------------------------';
    end;

    return round( extract( epoch from clock_timestamp() ) - extract( epoch
from transaction_timestamp() ) );
END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
;

select geral.fn_tempo_funcao();


Nessa função, a *transaction_timestamp()* retorna sempre o mesmo valor, que
é a data e hora do início da execução da função.
No entanto, como se pode observar, a *statement_timestamp()* retorna o mesmo
valor da *transaction_timestamp()* em todas as chamadas.
Eu considerei até o fato de que um comando *raise notice* pudesse não ser
interpretado pelo PG como um statement, logo, o último *statement* executado
seria o próprio início da função.
Por isso coloquei já um *select* dentro de um bloco *begin - end*, mas mesmo
assim o PG não interpreta como um novo statement, mantendo o*
statement_timestamp()* idêntico ao *transaction_timestamp()* .
Fora de uma função, o comportamento é aquele descrito no manual. Será que o
PG trata uma função e todos os seus comandos internos como um único
statement?

Obrigado pela atenção dispensada.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a