2017-09-01 27 views
0

私はウェブサービスリンクを呼び出すトリガーを持っています。 このリンクはを表示します。ビューはXMLを構成しています。コミット(挿入または更新)の前にトリガーを挿入

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を持っている場合 トリガが実行され

ビューでだけである句条件cod_situation = 6ですが、トリガーウェブサービスを呼び出す場合Vを閲覧するには、cod_situation = 6がまだありません。

私の質問は、どのようにトリガリンクを呼び出すことができますが、コミットがテーブル内で完了した後でなければなりません。

答えて

0

ポスト・コミット・フックは使用できません。これは正当な理由があります:Webサービスにアクセスする時点で、変更されたデータはすでにコミットされています。コミットが成功したにもかかわらず、コミットが失敗した場合、データベースは何をすべきですか?

一般に、トリガーから他のシステムにアクセスすることはお勧めできません。セッションはまだコミットされておらず、したがってロールバックが可能です。これは、データベースに書き込まれない可能性のあるトランザクションについて、Webサービスに通知されたことを意味します。これは破局的である場合とそうでない場合があります。さらに、データベースの機能をWebサービスの可用性に依存させるようにします。これは悪い習慣です。

あなたがしていることを絶対にしなければならない場合は、ビューの読み込みをストアドプロシージャに移動して、トリガーとWebサービスから呼び出してください。

関連する問題