20 連続問合せ通知(CQN)の使用
通知の種類には、オブジェクト変更通知(OCN - Object Change Notification)と問合せ結果変更通知(Query Result Change Notification)の2種類があります。表に保存されているデータを対象とした場合、データの新規作成、変更、削除を正確に捉えるにはトリガーを使います。ただし、トリガーを作成するとデータを操作するトランザクションに影響を与えます。連続問合せ通知は、登録したオブジェクトまたは問い合わせ結果の変更がコミットされたときに通知が行われます。PL/SQLによる実装では、登録したコールバック・プロシージャが通知として呼び出されます。トリガーとは異なり、データを変更したトランザクションの外でコールバック・プロシージャの処理が行われるため、通知を登録しても元のトランザクションに影響を与えません。
- 表EMPの列SALの値を3000から4000に変更し、コミットします。
- 上記のトランザクションIDと変更された行のROWIDを含んだデータが、通知として呼び出されたPL/SQLのコールバック・プロシージャに渡されます。
- コールバック・プロシージャ内で表EMPの列SALの値を、渡されたROWIDを条件として検索できます。しかし、列SALの値は4000であるとは限りません。
- 上記1と3の間に、列SALの値が更新されている可能性があります。
- 通知が発生した時点での列SALの値を求めるには、渡されたトランザクションIDを条件としてFlashback Queryを実行して求める必要があります。そこまでする必要があるなら、トリガーを使ったほうが簡単でしょう。
GRANT CHANGE NOTIFICATION TO <スキーマ名>;
GRANT EXECUTE ON DBMS_CQ_NOTIFICATION TO <スキーマ名>;
DBAユーザーで実行します。
SQL> GRANT CHANGE NOTIFICATION TO apexdev;
Grantが正常に実行されました。
SQL> GRANT EXECUTE ON DBMS_CQ_NOTIFICATION TO apexdev;
Grantが正常に実行されました。
SQL>
動作確認に、APEXのサンプル・データセットのEMP/DEPTを使用します。このデータセットに含まれる表EMPに問合せ結果変更通知を設定します。
SELECT APEXDEV.EMP.SAL FROM APEXDEV.EMP WHERE APEXDEV.EMP.ENAME = 'SCOTT'
SELECT APEXDEV.EMP.COMM FROM APEXDEV.EMP WHERE APEXDEV.EMP.ENAME = 'SCOTT'
SAL query result changed. Current value is 4000.
COMM query result changed. Current value is 200.
adrci> show incident -mode detail -p "incident_id=21599"
ADR Home = /opt/oracle/diag/rdbms/free/FREE:
*************************************************************************
**********************************************************
INCIDENT INFO RECORD 1
**********************************************************
INCIDENT_ID 21599
STATUS ready
CREATE_TIME 2026-09-04 04:38:50.580000 +00:00
PROBLEM_ID 2
CLOSE_TIME <NULL>
FLOOD_CONTROLLED none
ERROR_FACILITY ORA
ERROR_NUMBER 7445
ERROR_ARG1 ktcn_is_safe_plsql
ERROR_ARG2 SIGSEGV
ERROR_ARG3 ADDR:0xFD33BC7E9918
ERROR_ARG4 PC:0x2B75020
ERROR_ARG5 Address not mapped to object
ERROR_ARG6 <NULL>
ERROR_ARG7 <NULL>
ERROR_ARG8 <NULL>
ERROR_ARG9 <NULL>
ERROR_ARG10 <NULL>
ERROR_ARG11 <NULL>
ERROR_ARG12 <NULL>
SIGNALLING_COMPONENT Transactions
SIGNALLING_SUBCOMPONENT <NULL>
SUSPECT_COMPONENT <NULL>
SUSPECT_SUBCOMPONENT <NULL>
ECID <NULL>
IMPACTS 0
CON_UID 3461734982
PROBLEM_KEY ORA 7445 [ktcn_is_safe_plsql]
FIRST_INCIDENT 12071
FIRSTINC_TIME 2026-09-04 01:52:57.428000 +00:00
LAST_INCIDENT 21599
LASTINC_TIME 2026-09-04 04:38:50.580000 +00:00
IMPACT1 0
IMPACT2 0
IMPACT3 0
IMPACT4 0
KEY_NAME PdbName
KEY_VALUE FREEPDB1
KEY_NAME Client ProcId
KEY_VALUE oracle@5f1c1e0baa79 (TNS V1-V3).56677_247037836460048
KEY_NAME SID
KEY_VALUE 72.31772
KEY_NAME ECID
KEY_VALUE G6pjTKaG1v3V07ocxodqlg.17
KEY_NAME Service
KEY_VALUE freepdb1
KEY_NAME Module
KEY_VALUE APEXDEV/APEX:APP 100:5
KEY_NAME PQ
KEY_VALUE (16777219, 1788496729)
KEY_NAME Action
KEY_VALUE Processes - point: AFTER_SUBMIT,
KEY_NAME ProcId
KEY_VALUE 96.5
OWNER_ID 1
INCIDENT_FILE /opt/oracle/diag/rdbms/free/FREE/trace/FREE_ora_56677_1.trc
OWNER_ID 1
INCIDENT_FILE /opt/oracle/diag/rdbms/free/FREE/incident/incdir_21599/FREE_ora_56677_i21599.trc
1 row fetched
adrci>






