這幾天在研究是否可以在客製 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

arrow
arrow
    全站熱搜

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