Erro em function:

View: New views
2 Messages — Rating Filter:   Alert me  

Erro em function:

by Giuliani Deon Sanches-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Boa noite.

Eu tenho uma trigger cujo objetivo é fazer uma verificação de periodo
em uma tabela temporal.
A idéia é que durante uma edição (ou uma inserção com id igual a um já
existente) eu não possa informar um intervalo de datas conflitante com
um já existente.

A trigger esta abaixo:

CREATE OR REPLACE FUNCTION f_check_temporal_constraint() RETURNS TRIGGER AS $$
DECLARE
    check_id integer;
BEGIN
    IF NEW.tt_ini => NEW.tt_fim THEN
        RAISE EXCEPTION 'Período inválido: '
              'A data inicial é maior ou igual a data final!';
    END IF;

     -- a inserção de um novo registro com novo id é permitida sem problemas
    IF NEW.id IS NULL THEN
        RETURN NULL;
    END IF;

    EXECUTE 'SELECT TOP 1 id FROM $TG_TABLE_NAME$ WHERE '
               || '(NEW.id <> id) OR '
               || '(NEW.tt_ini < tt_ini OR NEW.tt_ini >= tt_fim) AND '
               || '(NEW.tt_fim <= tt_ini OR NEW.tt_fim > tt_fim) AND NOT '
               || '(NEW.tt_ini <= tt_ini AND NEW.tt_fim => tt_fim)'
    INTO check_id;

    IF check_id = NEW.id  THEN
       RAISE EXCEPTION 'Período inválido: Informações em conflito '
             'com registro existente.';
    END IF;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER t_check_temporal_constraint
BEFORE INSERT OR UPDATE ON minha_tabela
FOR EACH ROW EXECUTE PROCEDURE f_check_temporal_constraint();

Porém ao utilizar ela (pois quero testar ver se a lógica esta correta)
e tentar inserir um registro recebo o seguinte erro:

ERROR:  operator does not exist: timestamp without time zone =>
timestamp without time zone
LINE 1: SELECT   $1  =>  $2
                     ^
HINT:  No operator matches the given name and argument type(s). You
might need to add explicit type casts.
QUERY:  SELECT   $1  =>  $2
CONTEXT:  PL/pgSQL function "f_check_temporal_constraint" line 4 at IF

Sem a trigger os valores são inseridos corretamente.

--
twitter.com/giulianisanches
giulianisanches.blogspot.com
github.com/khaoz
_______________________________________________
pgbr-geral mailing list
pgbr-geral@...
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: Erro em function:

by Osvaldo Kussama :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/11/3 Giuliani Deon Sanches <giulianisanches@...>:

> Boa noite.
>
> Eu tenho uma trigger cujo objetivo é fazer uma verificação de periodo
> em uma tabela temporal.
> A idéia é que durante uma edição (ou uma inserção com id igual a um já
> existente) eu não possa informar um intervalo de datas conflitante com
> um já existente.
>
> A trigger esta abaixo:
>
> CREATE OR REPLACE FUNCTION f_check_temporal_constraint() RETURNS TRIGGER AS $$
> DECLARE
>    check_id integer;
> BEGIN
>    IF NEW.tt_ini => NEW.tt_fim THEN

Use >=
http://www.postgresql.org/docs/current/interactive/functions-comparison.html


>        RAISE EXCEPTION 'Período inválido: '
>              'A data inicial é maior ou igual a data final!';
>    END IF;
>
>     -- a inserção de um novo registro com novo id é permitida sem problemas
>    IF NEW.id IS NULL THEN
>        RETURN NULL;
>    END IF;
>
>    EXECUTE 'SELECT TOP 1 id FROM $TG_TABLE_NAME$ WHERE '

Creio que existe alguma confusão aqui.
Não existe a opção TOP 1 no PostgreSQL. Utilize a opção LIMIT 1 junto
com um ORDER BY.
http://www.postgresql.org/docs/current/interactive/sql-select.html

Creio que o correto seja:
EXECUTE 'SELECT id FROM ' || TG_TABLE_NAME || ' WHERE '


>               || '(NEW.id <> id) OR '
>               || '(NEW.tt_ini < tt_ini OR NEW.tt_ini >= tt_fim) AND '
>               || '(NEW.tt_fim <= tt_ini OR NEW.tt_fim > tt_fim) AND NOT '
>               || '(NEW.tt_ini <= tt_ini AND NEW.tt_fim => tt_fim)'
>    INTO check_id;
>
>    IF check_id = NEW.id  THEN
>       RAISE EXCEPTION 'Período inválido: Informações em conflito '
>             'com registro existente.';
>    END IF;
> END
> $$ LANGUAGE plpgsql;
>
> CREATE TRIGGER t_check_temporal_constraint
> BEFORE INSERT OR UPDATE ON minha_tabela
> FOR EACH ROW EXECUTE PROCEDURE f_check_temporal_constraint();
>
> Porém ao utilizar ela (pois quero testar ver se a lógica esta correta)
> e tentar inserir um registro recebo o seguinte erro:
>
> ERROR:  operator does not exist: timestamp without time zone =>
> timestamp without time zone
> LINE 1: SELECT   $1  =>  $2
>                     ^
> HINT:  No operator matches the given name and argument type(s). You
> might need to add explicit type casts.
> QUERY:  SELECT   $1  =>  $2
> CONTEXT:  PL/pgSQL function "f_check_temporal_constraint" line 4 at IF
>
> Sem a trigger os valores são inseridos corretamente.


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