我有触发器,可以调用 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 。所以,我的问题是,我怎样才能调用触发链接,但只有在表中完成提交后呢?
答案 0 :(得分:0)
提交后挂钩不可用。这是有充分理由的:在您访问Web服务时,已经提交了已修改的数据。如果提交成功但是提交失败,数据库应该怎么做?
一般来说,从触发器访问其他系统不是一个好主意:您的会话仍未提交,因此可以进行回滚。这意味着您的Web服务已被告知数据库中可能永远不会写入磁盘的事务。这可能是也可能不是灾难性的。此外,您可以根据Web服务的可用性使数据库的功能受到影响,这本身就是不好的做法。
如果你必须做你正在做的事情,你可以通过将视图读取移动到存储过程并从触发器和Web服务调用它来帮助自己。