- This topic has 1 reply, 2 voices, and was last updated 2 years, 2 months ago by José Laurindo Chiappa.
-
AuthorPosts
-
25 de agosto de 2022 at 9:40 am #156881headtechdevParticipant
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.
25 de agosto de 2022 at 2:55 pm #156882José Laurindo ChiappaModeratorBlz, 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…
-
AuthorPosts
- You must be logged in to reply to this topic.