2013-02-24 47 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功能