這幾天在研究是否可以在客製 Table 上利用 DB Trigger 直接呼叫標準 API 來用. 雖然, 可以用 Concurrent Program 來做, 了不起就排個一分鐘一次, 可是呢, 總是覺得 "一分鐘" 還是有個時間差, 而且交易量不大, 用排程的方式會造成很大量的時間都是浪費沒有交易的, 反而變成對 Server 是一個 Loading, 所以, 如果可以在當資料進來時, "馬上" 執行對應的處理程序, 不是很好嗎 :)

寫 Trigger 不是問題, 問題是在, "有些" 標準的 API 裡面如果有加上 COMMIT 或 ROLLBACK 指令, 在 Trigger 就不能呼叫它了, 你會得到以下訊息:

 

ORA-04092: cannot ROLLBACK in a trigger
ORA-04092: cannot SET SAVEPOINT in a trigger in Package ...

 

用 DB Trigger 呼叫 Concurrent Program 也不通, 可能是因為我這 Table 的新增修改不是透過 Oracle Form, 所以叫不起來? 也有人說 DB Trigger 根本不能呼叫 Concurrent Program (這點我很存疑)

最後才被我找到一個指令: PRAGMA AUTONOMOUS_TRANSACTION; 把它加在 Trigger Declare 區塊就可以了

簡單的說, 這個指令只讓每一段的 PL/SQL 的 COMMIT / ROLLBACK 都是獨立的. 這樣標準 API 裡面的 COMMIT / ROLLBACK 就不會被 Trigger 視為不合法的

 

參考:

Oralce Doc: http://docs.oracle.com/cd/B14117_01/appdev.101/b10807/13_elems002.htm

昭佑.天翔: http://tomkuo139.blogspot.com/2009/11/oracle-plsql-pragma-autonomoustransacti.html

創作者介紹

Aloz 的 Oracle ERP 天地

Aloz 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • 訪客
  • 分享:

    AFTER UPDATE On iby.IBY_PAY_INSTRUCTIONS_ALL

    FOR EACH ROW

    DECLARE

    result BOOLEAN;
    l_request_id NUMBER := NULL;
    V_USER_ID NUMBER;

    BEGIN

    V_USER_ID := NVL(:NEW.LAST_UPDATED_BY,:NEW.CREATED_BY);

    -----Triger 要下以下指令才能submit concurrent program
    result := FND_REQUEST.set_mode( TRUE );
    FND_PROFILE.put('USER_ID', V_USER_ID );
    FND_PROFILE.put('RESP_ID', '20639');
    FND_PROFILE.put('RESP_APPL_ID', '200');

    l_request_id := fnd_request.submit_request('SQLAP' --application
    , 'RESORT_PAYMENT_DOCUMENT' --Program
    , '' --Program Description
    , '' --start_time
    , FALSE --sub_request
    , :NEW.PAYMENT_INSTRUCTION_ID -- 1. 從這裡開始是參數
    );

    End;
    /
  • 謝謝你的分享喔...

    Aloz 於 2013/11/08 14:28 回覆

  • 小蔡
  • 若是透過Trigger 觸發 請求,
    必要再加上
    l_set_mode := FND_REQUEST.SET_MODE(TRUE); //標準 : 讓請求知道是Trigger產生的,這樣在表單上的行為才不會有異常
找更多相關文章與討論

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼