Trigger usando variável na condição if

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
rhicky
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 58
Registrado em: Sex, 20 Jul 2007 9:48 am
Localização: S. J. do Rio Preto/SP
Rhicky

Prezados,

Conforme código abaixo, esotu tentando utilizar o resultado de uma variável em uma condição para um insert... Porém, o banco está dando mensagem de trigger inválida:

Selecionar tudo

(ORA-04098: trigger is invalid and failed re-validation)
Vocês vêem algum problema estrutural com o código abaixo ? Eu posso utilizar a variável "v_cpf" na condição do "if" testando o resultado da consulta select cgc_cpf from EMPRESA ?

OBS.: código original foi reduzido para facilitar a visualização

Selecionar tudo

create or replace trigger trg_func_inc
  after insert on pfunc
  for each row

declare 
    v_cpf         VARCHAR2(11);     

begin
 select 
    cpf
 into 
    v_cpf
 from ppessoa 
 where codigo =:new.codpessoa;
 
 
if (v_cpf not in (select cgc_cpf from EMPRESA)) then 

   insert into EMPRESA
   (CGC_CPF)
   VALUES
   (v_cpf);

else

   update EMPRESA
   se SITUACAO = 'A'
   where CGC_CPF = v_cpf;

end if;


end trg_func_inc;
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá Ricky,

A mensagem de erro informada por você indica que a sua TRIGGER está inválida. Ao tentar fazer um comando INSERT em PFUNC, o ORACLE identifica que sua trigger está inválida e tenta recompilar a mesma em tempo de execução.

Como se trata de um erro fatal em seu caso (ex: algum comando com sintaxe errada que só pode ser revalidado com a intervenção do programador) o bamco lhe devolve este erro "ORA-".

Ao invés de exatamente lhe dizer o ponto que o ocorre o erro, acho mais válido para você se seguisse os passos abaixo:

A) Tenta recompilar a trigger:

Selecionar tudo

ALTER TRIGGER <NOME_TRIGGER> COMPILE;
B) Verifique os erros de compilação da trigger:

Selecionar tudo

 SHOW ERRORS TRIGGER <NOME_TRIGGER>;
Este último comando vai lhe dar uma pista sobre o erro da sua trigger. Com base na real mensagem de erro (pode ser mais de uma), você pode pesquisar mais a fundo o problema.

Sua trigger realmente apresenta problemas, mas se você efetuar os passos que lhe indiquei acima, você vai conseguir identificar o que estou lhe falando por cima. Uma dica: revise a sintaxe dos comandos SQL.

Uma recomendação: você pode usar ferramentas grátis como o SQLDEVELOPER (que pode ser baixado do site da ORACLE) que lhe ajudaria a agilizar a análise dos objetos inválidos de seu banco de dados.

Abraços e boa sorte,

Sergio Coutinho
rhicky
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 58
Registrado em: Sex, 20 Jul 2007 9:48 am
Localização: S. J. do Rio Preto/SP
Rhicky

Coutinho,
Primeiramente, agradeço pela resposta.
Segui os passos indicados:

Selecionar tudo

ALTER TRIGGER TRG_FUNC_INC COMPILE;
SHOW ERRORS TRIGGER TRG_FUNC_INC;
Porém, na segunda linha, o banco retorna o seguinte erro:

Selecionar tudo

ORA-00900: instrução SQL inválida
Sendo assim, continuo sem pistas do problema. Por favor, poderia ajudar ?
rhicky
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 58
Registrado em: Sex, 20 Jul 2007 9:48 am
Localização: S. J. do Rio Preto/SP
Rhicky

Após vários testes, descobri que o problema está na linha abaixo:

Selecionar tudo

if (v_cpf not in (select cgc_cpf from EMPRESA)) then 
O problema está exatamente no fato de eu estar testando a condição da variável v_cpf na consulta (select cgc_cpf from EMPRESA).

Alterando a linha conforme demonstro abaixo, a trigger funciona normalmente. Sendo assim, pergunto a trigger aceita testar variável com uma consulta ?

Selecionar tudo

if (v_cpf not in ('123456')) then 
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Rhicky,

Algumas perguntas básicas:

- Sua trigger compila agora sem erros?
- Se ainda não compila, qual a mensagem de erro?
- Se ela não apresenta mais erros de compilação, o que ocorre quando executa o comando de INSERT?
- Aparece alguma mensagem de erro na execução da trigger? Qual seria esta mensagem?

Se você seguir sempre estes procedimentos (ver as mensagem de erro, pesquisar) e também postar eles aqui para os foristas, creio que conseguirá respostas mais rápidas.

Abraços,

Sergio Coutinho
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Não é possível incluir uma query como parte de uma condição em pl/sql.
Geralmente realizo este tipo de teste da seguinte forma:

Selecionar tudo

create or replace trigger trg_func_inc
  after insert on pfunc
  for each row
declare
v_cpf         VARCHAR2(11);     

begin
select
    cpf
into
    v_cpf
from ppessoa
where codigo =:new.codpessoa;

for x in
( select count(1) existe from dual where exists -- Apenas uma linha será retornada
                                                -- com o valor 1 ou 0, dependendo se a consulta
                                                -- interna recuperar ou não algum registro
  ( select 1 from empresa e where e.cgc_cpf = v_cpf )
) loop

  if ( x.existe = 1 ) then
 
     insert into EMPRESA
     (CGC_CPF)
     VALUES
     (v_cpf);

  else

     update EMPRESA
     se SITUACAO = 'A'
     where CGC_CPF = v_cpf;

  end if;

end loop;

end trg_func_inc;
rhicky
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 58
Registrado em: Sex, 20 Jul 2007 9:48 am
Localização: S. J. do Rio Preto/SP
Rhicky

Problema resolvido.
Obrigado!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes