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

Responder a