2013-02-24 53 views
3

我正在尋找一種使用Pl/SQL的方法來檢查'立即執行'執行的語句是否是dml語句。Oracle:檢查dml語句

+1

我不知道。基本上,如果您使用Execute Immediate,那麼您的工作就是知道正在運行的是什麼 - 即您絕不應該讓它運行由用戶或其他程序提供的任意代碼。 – 2013-02-25 03:55:18

回答

0

我想你可以使用SQL%ROWCOUNT來檢查它。例如(粗塊,未經測試)

set serveroutput on 
begin 
execute immediate 'update tableA set fieldA=100'; 
if(SQL%ROWCOUNT > 0) then 
dbms_output.put_line('DML'); 
end if; 
end; 
/

SQL%ROWCOUNT返回受最近的DML行數。因此,如果執行立即執行的語句是DML語句,並且如果改變了任何內容,那麼sql%rowcount將大於0.否則,如果它是DDL,那麼使用SQL%ROWCOUNT很可能會引發異常(或這將等同於0)

+3

如果某些更新查詢像「update someTable where criterai that no result?」 SQL%ROWCOUNT將爲0,因此DDL的檢測將失敗pal。 – 2013-02-25 06:42:18

1

有可能檢查一個解決方案,如果查詢字符串包含「插入」或「更新」或...
但我不認爲這可能是通用和一致的解決方案
如果sql正在調用可能調用DML或DLL的包或storprocedure,該怎麼辦?
我覺得你可能會在BEFORE/AFTER DDL TRIGER或調查ora_sysevent功能