我正在寻找一种使用Pl / SQL的方法来检查由'Execute immediate'执行的语句是否是dml语句。
答案 0 :(得分:1)
可能有一个解决方案来检查查询字符串是否包含“INSERT”或“UPDATE”或...
但我认为这可能不是一般和一致的解决方案
如果sql正在调用可能调用DML或DLL的包或storprocedure,该怎么办?
我想您可以转发BEFORE / AFTER DDL TRIGER或调查ora_sysevent
功能
答案 1 :(得分: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影响的行数。因此,如果execute immediate执行的语句是DML语句,并且如果更改了任何内容,那么sql%rowcount将大于0.否则,如果它是DDL,那么使用SQL%ROWCOUNT很可能会引发异常(或它等于0)