|
View:
New views
2 Messages
—
Rating Filter:
Alert me
|
|
|
Erro em function: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: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 |
| Free embeddable forum powered by Nabble | Forum Help |