在提交之前触发(插入或更新)

时间:2017-09-01 14:06:07

标签: oracle web-services soap triggers

我有触发器,可以调用 webservice 链接。 此链接读取查看视图正在撰写XML。

问题是: 当我有一个cod_situation = 6时执行触发器:

CREATE OR REPLACE TRIGGER trg_candidato_chama_link 
       AFTER  INSERT  OR UPDATE ON cand_proc_sel 
         FOR EACH ROW DECLARE   
            v_url VARCHAR2(4000);   
            req   UTL_HTTP.REQ;   
            resp  UTL_HTTP.RESP;   
            value VARCHAR2(1536);
           --temp   
           v_count         INTEGER;   
           v_alternativas  VARCHAR2(1000);  
           v_error         VARCHAR2(4000);
BEGIN   
if (:new.cod_situation = 6 )  THEN
            v_url := 'http://.../frameweb/amxv7/amx_new_employee';
            req := UTL_HTTP.BEGIN_REQUEST(v_url);
            UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
            resp := UTL_HTTP.GET_RESPONSE(req);
            LOOP
              UTL_HTTP.READ_LINE(resp, value, TRUE);
              DBMS_OUTPUT.PUT_LINE(value);
            END LOOP;
            UTL_HTTP.END_RESPONSE(resp);
      END IF;

    EXCEPTION   WHEN UTL_HTTP.END_OF_BODY THEN
        UTL_HTTP.END_RESPONSE(resp);

        INSERT INTO integratio_log(data, cod_integracao, status, rotina, obs) VALUES(SYSDATE, 7, 'SUCCESS', 'TEST DOM, TRIGGER URL', 'Url : ' || v_url || ' count test: '|| v_count);   WHEN OTHERS THEN
        v_error := To_Char(SQLERRM);

        INSERT INTO integracao_log(data, cod_integracao, status, rotina, obs) VALUES(SYSDATE, 7, 'FAIL', 'TEST DOM, TRIGGER  URL', 'Url : ' || v_url || ' # qtd: '|| v_count || ' # Erro: ' || v_error);

    END;

但问题是:

子句在视图中只是条件 cod_situation = 6 ,但当触发器调用 webservice 我们在哪里阅读查看,我还没有 cod_situation = 6

所以,我的问题是,我怎样才能调用触发链接,但只有在表中完成提交后呢?

1 个答案:

答案 0 :(得分:0)

提交后挂钩不可用。这是有充分理由的:在您访问Web服务时,已经提交了已修改的数据。如果提交成功但是提交失败,数据库应该怎么做?

一般来说,从触发器访问其他系统不是一个好主意:您的会话仍未提交,因此可以进行回滚。这意味着您的Web服务已被告知数据库中可能永远不会写入磁盘的事务。这可能是也可能不是灾难性的。此外,您可以根据Web服务的可用性使数据库的功能受到影响,这本身就是不好的做法。

如果你必须做你正在做的事情,你可以通过将视图读取移动到存储过程并从触发器和Web服务调用它来帮助自己。