我有一个触发器,它调用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] 删除。
我来说两句