我正在寻找一种使用Pl/SQL检查由'Execute immediate‘执行的语句是否为dml语句的方法。
发布于 2013-02-25 14:38:34
检查查询字符串是否包含"INSERT“或"UPDATE”或...
但我认为这可能不是普遍和一致的解决方案。
如果SQL调用的包或存储过程可能调用DML或DLL,该怎么办?
我认为您可以依赖BEFORE / AFTER DDL TRIGER或研究ora_sysevent函数
发布于 2013-02-25 13:04:04
我认为您可以使用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)
https://stackoverflow.com/questions/15057967
复制相似问题