2017-09-01 29 views
0

我有一個觸發器,它調用webservice鏈接。 此鏈接閱讀查看,那視圖是組成一個XML。TRIGGER在提交之前(插入或更新)

的problema是:

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這樣 觸發執行

where子句中在視圖僅僅是條件cod_situation = 6,但是當觸發器調用webservice我們在那裏讀取V IEW,我沒有cod_situation = 6呢。

所以,我的問題是,我怎麼能叫扳機連桿,但提交的表格中做了之後?

回答

0

賽後commit鉤子不可用。這是有原因的:在訪問Web服務時,已修改的數據已被提交。如果提交成功但數據庫提交失敗,數據庫應該做什麼?

一般來說它不是從觸發訪問其他系統是一個好主意:您的會話仍然沒有因此犯了回滾是可能的。這意味着您的Web服務已被告知數據庫中可能永遠不會寫入磁盤的事務。這可能是災難性的,也可能不是災難性的。此外,您使數據庫的功能取決於Web服務的可用性,這本身就是不好的做法。

如果你絕對必須做你正在做的,你會通過移動視圖讀成一個存儲過程,調用從觸發器和Web服務幫自己一個忙什麼。

相關問題