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

Responder a