Pular para o conteúdo

Fóruns SQL e PL/SQL Trigger Só Executa Primeiro Bloco do Programa Trigger Só Executa Primeiro Bloco do Programa

#92311
burga
Participante

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