【发布时间】:2013-02-10 01:34:00
【问题描述】:
我正在寻找一种使用 Pl/SQL 的方法来检查由“立即执行”执行的语句是否是 dml 语句。
【问题讨论】:
-
我不知道。基本上,如果您使用 Execute Immediate,那么您的工作就是了解正在运行的内容 - 即,您首先不应该让它运行用户或其他程序提供的任意代码。
我正在寻找一种使用 Pl/SQL 的方法来检查由“立即执行”执行的语句是否是 dml 语句。
【问题讨论】:
可能有一个解决方案来检查查询字符串是否包含“INSERT”或“UPDATE”或...
但我认为这可能不是通用且一致的解决方案。
如果 SQL 正在调用可能调用 DML 或 DLL 的包或存储过程怎么办?
我认为你可能依赖BEFORE / AFTER DDL TRIGER 或调查ora_sysevent 函数
【讨论】:
我认为您可以使用 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 影响的行数。因此,如果由 execute immediate 执行的语句是 DML 语句并且如果它改变了任何内容,那么 sql%rowcount 将大于 0。否则,如果它是 DDL,那么使用 SQL%ROWCOUNT 很可能会引发异常(或它将等于 0)
【讨论】: