【问题标题】:Oracle: Check dml statementOracle:检查 dml 语句
【发布时间】:2013-02-10 01:34:00
【问题描述】:

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

【问题讨论】:

  • 我不知道。基本上,如果您使用 Execute Immediate,那么您的工作就是了解正在运行的内容 - 即,您首先不应该让它运行用户或其他程序提供的任意代码。

标签: sql oracle plsql dml


【解决方案1】:

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

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

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

我认为你可能依赖BEFORE / AFTER DDL TRIGER 或调查ora_sysevent 函数

【讨论】:

    【解决方案2】:

    我认为您可以使用 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)

    【讨论】:

    • 在某些更新查询的情况下,例如“更新 someTable where a criterai that has no result ?” SQL%ROWCOUNT 将是 0,因此 DDL 检测将失败。
    猜你喜欢
    • 2013-07-16
    • 2020-02-24
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    相关资源
    最近更新 更多