› Fóruns › SQL e PL/SQL › Trigger Só Executa Primeiro Bloco do Programa › Trigger Só Executa Primeiro Bloco do Programa
Melhorando:
procedure:
CREATE OR REPLACE PROCEDURE P_ATUALIZA_SH_PCWMSOUTPUT (reg_pcwmsoutput IN pcwmsoutput%ROWTYPE)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO "sh_pcwmsoutput"@logixteste VALUES (reg_pcwmsoutput.TIPO,
reg_pcwmsoutput.NUMERO,
reg_pcwmsoutput.CODPROD,
reg_pcwmsoutput.CODCLI,
reg_pcwmsoutput.CODFORNEC,
reg_pcwmsoutput.CODFILIAL,
reg_pcwmsoutput.QTSEP,
reg_pcwmsoutput.QTREC,
reg_pcwmsoutput.QTAVA,
reg_pcwmsoutput.QTCOR,
reg_pcwmsoutput.DTEMISSAO,
reg_pcwmsoutput.SEMAFORO,
reg_pcwmsoutput.DTPROCESSAMENTO,
reg_pcwmsoutput.NUMLOTE,
reg_pcwmsoutput.DTFABRICACAO,
0);
COMMIT;
END;
trigger:
CREATE OR REPLACE TRIGGER T_INSERT_SH_PCWMSOUTPUT
BEFORE INSERT ON PCWMSOUTPUT FOR EACH ROW
DECLARE
l_reg_pcwmsoutput PCWMSOUTPUT%ROWTYPE;
BEGIN
l_reg_pcwmsoutput.TIPO := :NEW.TIPO;
l_reg_pcwmsoutput.NUMERO := :NEW.NUMERO;
l_reg_pcwmsoutput.CODPROD := :NEW.CODPROD;
l_reg_pcwmsoutput.CODCLI := :NEW.CODCLI;
l_reg_pcwmsoutput.CODFORNEC := :NEW.CODFORNEC;
l_reg_pcwmsoutput.CODFILIAL := :NEW.CODFILIAL;
l_reg_pcwmsoutput.QTSEP := :NEW.QTSEP;
l_reg_pcwmsoutput.QTREC := :NEW.QTREC;
l_reg_pcwmsoutput.QTAVA := :NEW.QTAVA;
l_reg_pcwmsoutput.QTCOR := :NEW.QTCOR;
l_reg_pcwmsoutput.DTEMISSAO := :NEW.DTEMISSAO;
l_reg_pcwmsoutput.SEMAFORO := :NEW.SEMAFORO;
l_reg_pcwmsoutput.DTPROCESSAMENTO := :NEW.DTPROCESSAMENTO;
l_reg_pcwmsoutput.NUMLOTE := :NEW.NUMLOTE;
l_reg_pcwmsoutput.DTFABRICACAO := :NEW.DTFABRICACAO;
p_atualiza_sh_pcwmsoutput(l_reg_pcwmsoutput);
:NEW.SEMAFORO := 3;
END;
EDITADO:
Na trigger coloquei ela de AFTER… Corrigido pra BEFORE INSERT.
EDIT2:
Indo pela sua lógica, você quer inserir um registro na tabela PCWMSOUTPUT com semaforo = 1.
Replicar o registro pra tabela do dblink e depois atualizar o semaforo pra 3 para saber que o registro foi replicado com sucesso.
Existe um problema pro caso dessa trigger, ela sempre tentará inserir o registro na tabela do dblink antes de inserir na tabela do oracle então se der algum erro no insert do dblink, o registro também não irá pra tabela do Oracle. Isso tira todo objetivo do semaforo (caso o objetivo seja o mesmo da minha suposição).
Outro problema é no caso de inserir o registro com sucesso mas você efetuar um rollback. Lembrando que na tabela do dblink você já efetuou o commit, o rollback no Oracle vai ocasionar na dessincronização das duas tabelas, ou seja, o registro vai pra tabela do dblink mas nao vai existir na do Oracle.
Este é um dos problemas que pode ocorrer neste caso de sincronização síncrona de dados utilizando dblink e triggers. Você tem que ver se isto não vai gerar problemas futuros pra você…