3

我正在寻找一种使用 Pl/SQL 的方法来检查由“立即执行”执行的语句是否是 dml 语句。

4

2 回答 2

1

可能有一个解决方案来检查查询字符串是否包含“INSERT”或“UPDATE”或......

但我认为这可能不是通用且一致的解决方案。

如果 SQL 正在调用可能调用 DML 或 DLL 的包或存储过程怎么办?

我认为您可能会依赖BEFORE / AFTER DDL TRIGER或调查ora_sysevent功能

于 2013-02-25T06:38:34.423 回答
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)

于 2013-02-25T05:04:04.497 回答