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

大卫·阿马拉尔

我有一个触发器,它调用Web服务的链接。此链接读取一个View,该视图正在组成一个 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;

但是,问题是:

where子句中的视图仅仅是条件cod_situation = 6,但当触发调用Web服务,我们读到的景观,我没有cod_situation = 6呢。

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

佛斯费尔

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章