2009/7/3 Leonardo Barbosa <leo...@gmail.com>: > 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 >>
Isso que dá ficar utilizando nomes de campos com aspas. Agora tem que *sempre* usar aspas. http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS Osvaldo _______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral