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