Galera, estamos quase la.... *ERROR: record "new" has no field "jogador1" CONTEXT: PL/pgSQL function "verifica_6_partidas" line 4 at SQL statement SQL function "sp_ins_partida" statement 1*
CREATE FUNCTION verifica_6_partidas() RETURNS trigger AS $$ DECLARE TOTAL_JOGOS_ANDAMENTO int; BEGIN SELECT COUNT(*) INTO TOTAL_JOGOS_ANDAMENTO FROM "Partida" WHERE "Fim" IS NULL AND ("Jogador1" = NEW.Jogador1 OR "Jogador2" = NEW.Jogador2); IF ("TOTAL_JOGOS_ANDAMENTO" = 6) THEN RAISE EXCEPTION 'O jogador possui 6 partidas em andamento. Não foi possível prosseguir esta operação!'; END IF; RETURN "TOTAL_JOGOS_ANDAMENTO"; END; $$ LANGUAGE plpgsql; *É correto chamar o NEW.Jogador1 e NEW.Jogador2 ??* 2009/7/3 Osvaldo Kussama <osvaldo.kuss...@gmail.com> > 2009/7/3 Leonardo Barbosa <leo...@gmail.com>: > > Osvaldo, foi retornado um erro informando que a linguagem plpgsql não > > existe! O que faço? > > > > 2009/7/3 Osvaldo Kussama <osvaldo.kuss...@gmail.com> > >> > >> 2009/7/3 Leonardo Barbosa <leo...@gmail.com>: > >> > Salve galera! > >> > > >> > Tou com a necessidade de criar uma trigger para verificar de a > >> > quantidade de > >> > jogos numa tabela é menor ou igual a 6. Se for maior que 6, o insert > não > >> > deve ser efetuado. > >> > > >> > Estou tentando criar a seguinte trigger para realizar essa tarefa: > >> > > >> > CREATE FUNCTION verifica_6_partidas() RETURNS trigger AS $$ > >> > BEGIN > >> > SELECT COUNT(*) AS TOTAL_JOGOS_ANDAMENTO FROM "Partida" WHERE "Fim" > IS > >> > NULL AND ("Jogador1" = NEW.Jogador1 OR "Jogador2" = NEW.Jogador2) > >> > IF ("TOTAL_JOGOS_ANDAMENTO" = 6) THEN > >> > RAISE EXCEPTION 'O jogador possui 6 partidas em andamento. Não > foi > >> > possível prosseguir esta operação!'; > >> > END IF; > >> > END; > >> > $$ LANGUAGE internal > >> > > >> > CREATE TRIGGER "trigger_verifica_6_partidas" BEFORE INSERT > >> > ON "public"."Partida" FOR EACH STATEMENT > >> > EXECUTE PROCEDURE "verifica_6_partidas"(); > >> > > >> > A mensagem de erro que é retornada é a seguinte: > >> > ERROR: there is no built-in function named " > >> > SELECT COUNT(*) AS TOTAL_JOGOS_ANDAMENTO FROM "Partida" WHERE "Fim" > IS > >> > NULL AND ("Jogador1" = NEW.Jogador1 OR "Jogador2" = NEW.Jogador2) > >> > IF ("TOTAL_JOGOS_ANDAMENTO" = 6) THEN > >> > RAISE EXCEPTION 'O jogador possui 6 partidas em andamento. Não > foi > >> > possível prosseguir esta operação!'; > >> > > >> > Alguem ai sabe o que pode estar acontecendo? Onde estou errando ? > >> > > >> > >> > >> Tente: > >> > >> CREATE FUNCTION verifica_6_partidas() RETURNS trigger AS $$ > >> DECLARE > >> TOTAL_JOGOS_ANDAMENTO int; > >> BEGIN > >> SELECT COUNT(*) INTO TOTAL_JOGOS_ANDAMENTO FROM "Partida" WHERE > >> "Fim" IS NULL AND ("Jogador1" = NEW.Jogador1 OR "Jogador2" = > >> NEW.Jogador2); > >> IF ("TOTAL_JOGOS_ANDAMENTO" = 6) THEN > >> RAISE EXCEPTION 'O jogador possui 6 partidas em andamento. Não > >> foi possível prosseguir esta operação!'; > >> END IF; > >> END; > >> $$ LANGUAGE plpgsql; > >> > >> Repare no SELECT...INTO... > >> > >> > http://www.postgresql.org/docs/current/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW > >> e no ; ao final. > >> A variável TOTAL_JOGOS_ANDAMENTO precisa ser declarada, ela tem que > >> ser uma variável e não é um alias. > >> > > > Veja CREATE LANGUAGE: > http://www.postgresql.org/docs/8.3/interactive/sql-createlanguage.html > > Para que ela passe a existir nos novos banco de dados crie também no > template. > > Osvaldo > > PS. E não deixe de ver a observação do Euler > _______________________________________________ > pgbr-geral mailing list > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > -- Atenciosamente, Leonardo Barbosa
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral