觸發器中獲取SQL語句
從Oracle9i開始,Oracle增加了在觸發器中獲取觸發語句的功能。
9i開始,在系統定義事件屬性中,增加了ORA_SQL_TXT屬性,可以返回觸發觸發器的SQL語句。
使用方法很簡單,看一個簡單的例子:
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));
表已建立。
SQL> CREATE TABLE T_LOG (EXECUTE_DATE DATE, SQL_STATMENT CLOB);
表已建立。
SQL> CREATE OR REPLACE TRIGGER T
2 BEFORE INSERT OR UPDATE OR DELETE ON T
3 FOR EACH ROW
4 DECLARE
5 V_SQL_OUT ORA_NAME_LIST_T;
6 V_NUM NUMBER;
7 V_SQL_STATMENT VARCHAR2(32767);
8 BEGIN
9 V_NUM := ORA_SQL_TXT(V_SQL_OUT);
10 FOR I IN 1 .. V_NUM LOOP
11 V_SQL_STATMENT := V_SQL_STATMENT || V_SQL_OUT(I);
12 END LOOP;
13 INSERT INTO T_LOG (EXECUTE_DATE, SQL_STATMENT)
14 VALUES (SYSDATE, V_SQL_STATMENT);
15 END;
16 /
觸發器已建立
SQL> INSERT INTO T VALUES (1, 'A');
已建立 1 行。
SQL> INSERT INTO T (ID) VALUES (2);
已建立 1 行。
SQL> UPDATE T SET NAME = 'B' WHERE ID = 2;
已更新 1 行。
SQL> DELETE T;
已刪除2行。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
會話已更改。
SQL> SELECT * FROM T_LOG;
EXECUTE_DATE SQL_STATMENT
------------------- -----------------------------------------------
2007-09-13 22:55:35 INSERT INTO T VALUES (1, 'A')
2007-09-13 22:55:46 INSERT INTO T (ID) VALUES (2)
2007-09-13 22:55:54 UPDATE T SET NAME = 'B' WHERE ID = 2
2007-09-13 22:56:00 DELETE T
2007-09-13 22:56:00 DELETE T
也可以利用VARCHAR2(4000)來代替CLOB,不過在插入的時候需要注意擷取前4000個字元。
注意,從9206及以上版本,Oracle不再允許DML觸發器中使用這個函式,只有在系統事件觸發器中才能獲取到SQL語句。
試圖在DML觸發器中使用ORA_SQL_TXT函式,這個函式返回NULL,而且傳入的OUT變數將不會被初始化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69422/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用SQL語句獲取SQLite中的表定義SQLite
- Laravel 獲取執行的sql語句LaravelSQL
- mysql繞過行觸發器,實現語句觸發器MySql觸發器
- 監控oracle的觸發器語句(轉)Oracle觸發器
- Oracle 獲取ddl語句Oracle
- 使用自治事務在觸發器中執行DDL語句示例觸發器
- 使用系統級觸發器禁用DDL語句觸發器
- SQL觸發器SQL觸發器
- Oracle中獲取TABLE的DDL語句的方法Oracle
- 獲取oracle sql語句詳細些執行計劃OracleSQL
- 使用mysqlsniffer捕獲SQL語句MySql
- 瞭解SQL Server觸發器及觸發器中的事務AWSQLServer觸發器
- SQL Sever 2000中的前觸發器和後觸發器SQL觸發器
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- 使用SQL語句從資料庫一個表中隨機獲取資料SQL資料庫隨機
- SQL Server 觸發器SQLServer觸發器
- 建立SQL觸發器SQL觸發器
- SQL Server觸發器SQLServer觸發器
- SQL觸發器(二)SQL觸發器
- Oracle獲取資料庫中的物件建立語句Oracle資料庫物件
- 【原】獲取SQLServer的最完整資料字典的SQL語句SQLServer
- 【轉】通過sql語句獲取資料庫的基本資訊SQL資料庫
- 獲取物件DDL語句的方法物件
- 獲取物件的構建語句物件
- 獲取oracle正在處於等待狀態的sql語句的執行計劃的語句OracleSQL
- 【SQL Server】-- 一觸即發之觸發器SQLServer觸發器
- Oracle中獲取最低效的 topSQL的語句 (引用)OracleSQL
- 使用 EXPLAIN PLAN 獲取SQL語句執行計劃 (R0.1)AISQL
- sql 中的with 語句使用SQL
- SQL Server中類似Oracle中before觸發器SQLServerOracle觸發器
- sql-server觸發器SQLServer觸發器
- Sql Server系列:觸發器SQLServer觸發器
- SQL Server中獲取資料庫名、表名、欄位名和欄位註釋的SQL語句SQLServer資料庫
- oracle之 獲取建表ddl語句Oracle
- [提權禁區] SQL語句利用xp_cmdshell獲取許可權SQL
- WPF 前臺觸發器實時獲取當前時間觸發器
- javascript如何獲取觸發事件的物件JavaScript事件物件
- SQL Server:觸發器詳解SQLServer觸發器