Pular para o conteúdo

Fóruns Banco de dados Oracle Trigger before insert preciso usar o campo outra tabela ex. :NEW.CPO := TAB.CPO Responder a: Trigger before insert preciso usar o campo outra tabela ex. :NEW.CPO := TAB.CPO

#156882
Avatar photoJosé Laurindo Chiappa
Moderador

    Blz, colega ? Não, sorry mas isso que vc escreveu absolutamente NÃO VAI FUNCIONAR : a regra é que para vc obter dados de uma tabela vc TEM QUE TER um SELECT trazendo esses dados – a Única EXCEÇÃO a isso é dentro de uma trigger do tipo FOR EACH ROW, a trigger Automaticamente já mantém os dados LINHA SENDO INSERIDA ou UPDATEada ou DELETADA na memória nas váriáveis :NEW e :OLD, isso (obviamente) para a Tabela à qual a trigger está relacionada…. Quaisquer OUTROS dados que vc precise, NÃO TEM JEITO, vc TEM que escrever um SELECT e guardar esses dados em variável/variáveis apropriadas….
    Com isso em mente, a idéia geral da tua query ficaria mais ou menos assim :

    create or replace trigger TRG_DETALHE
      before insert
      on DETALHE 
      for each row
    declare
      v_NUMPEDIDO_MESTRE  MESTRE.NUMPEDIDO%TYPE;
      v_SEQUENCIA_MESTRE  MESTRE.SEQUENCIA%TYPE;
    begin
      SELECT NUMPEDIDO          , SEQUENCIA
        INTO v_NUMPEDIDO_MESTRE , v_SEQUENCIA_MESTRE
        FROM MESTRE
       WHERE ... condiçÕes de chave da tabela;
      --
      :NEW.NUMPEDIDO := v_NUMPEDIDO_MESTRE;
      :NEW.SEQUENCIA := v_SEQUENCIA_MESTRE;
    end TRG_DETALHE;

    ok ?? É algo nesta linha aí de cima, isso Se realmente quando ocorre o INSERT na tabela DETALHE a tabela MSTRE já foi MESMO preenchida, ok ?
    qquer dúvida, pergunta aí e tentamos te ajudar mais…

    Abraços,

    Chiappa

    OBSERVAÇÃO : vc não diz Claramente se é o caso , mas Via de Regra, quando temos uma Chave que é PK na tabela MESTRE e essa chave é Artificial alimentada por SEQUENCE ou IDENTITY (e assim vc NUNCA sabe qual valor vai ser gerado), normalmente a aplicação deveria é usar um INSERT … RETURNING valordacolunachave e GUARDAR esse valor numa variável Global dela , e seria Esse valor que seria usado nos INSERTs da tabela DETALHE – https://oracle-base.com/articles/misc/dml-returning-into-clause mostra isso, Avalie se é o caso…