Pular para o conteúdo
  • Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 2 anos, 3 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #156881
    headtechdev
    Participante

      Tenho duas tabelas:
      Mestre:

      Numpedido Sequencia Codigo Qtdcaixas

      12984 1 HCP0030T 8

      Detalhe:

      Numpedido Sequencia ID Qtdcaixas Qtdpecas Cxaini Cxafim

      12984 1 1 5 20 1 5

      O problema é que a aplicação que estou usando não está preenchendo os campos Numpedido e Sequencia que fazem parte da PK da tabela detalhe com os dados dos campos correspondentes da tabela Mestre.

      Sendo assim tentei criar uma trigger no before insert da tabela Detalhe para preencher estes campos, segue o código para me ajudarem, pois não estou sabendo como fazer isso.

      create or replace trigger TRG_DETALHE
        before insert
        on DETALHE 
        for each row
      declare
        -- local variables here
      begin
        :NEW.NUMPEDIDO := MESTRE.NUMPEDIDO; /*ACUSA ERRO AQUI*/
        :NEW.SEQUENCIA := MESTRE.SEQUENCIA; /*ACUSA ERRO AQUI*/
      end TRG_DETALHE;

      Desde já agradeço, obrigado.

      #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…

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress