【问题标题】:Truncating a table in a stored procedure在存储过程中截断表
【发布时间】:2010-10-12 03:54:57
【问题描述】:

当我在 Oracle shell 中运行以下命令时,它工作正常

truncate table table_name

但是当我尝试将其放入存储过程中时

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name;
END test;
/

失败了

ERROR line 3, col 14, ending_line 3, ending_col 18, Found 'table', Expecting:  @   ROW  or   (   or   .   or   ;   :=

为什么?

【问题讨论】:

    标签: oracle stored-procedures plsql ddl


    【解决方案1】:

    Oracle PL/SQL 中的所有 DDL 语句都应该在语句之前使用 Execute Immediate。因此你应该使用:

    execute immediate 'truncate table schema.tablename';
    

    【讨论】:

    • 在某些情况下,SQL Server 中也会出现类似的问题 - 解决方案是相同的,除了 immediate 关键字 - 通过动态 SQL 执行运行截断。
    【解决方案2】:

    试试下面的代码

    execute immediate 'truncate table tablename' ;
    

    【讨论】:

      【解决方案3】:

      您应该知道,不能像从 PL/SQL 块中对 DML 那样直接运行 DDL 语句,因为 PL/SQL 不直接支持后期绑定,它只支持编译时绑定,这对 DML 来说很好。因此,为了克服此类问题,oracle 提供了一种动态 SQL 方法,可用于执行 DDL 语句。动态 sql 方法是关于在运行时解析和绑定 sql 字符串。 此外,您应该记住 DDL 语句默认是自动提交的,因此您应该小心使用动态 SQL 方法的任何 DDL 语句,以防在执行 DDL 之前有一些 DML(需要使用 TCL 显式提交)存储过程/函数。

      您可以使用以下任何一种动态 sql 方法从 pl/sql 块执行 DDL 语句。

      1) 立即执行

      2) DBMS_SQL 包

      3) DBMS_UTILITY.EXEC_DDL_STATEMENT (parse_string IN VARCHAR2);

      希望这能通过解释回答您的问题。

      【讨论】:

        【解决方案4】:

        除了立即执行,您还可以使用

        DBMS_UTILITY.EXEC_DDL_STATEMENT('TRUNCATE TABLE tablename;');

        语句失败,因为存储过程正在执行 DDL,并且某些 DDL 实例可能使存储过程无效。通过使用立即执行或 exec_ddl 方法,DDL 是通过未解析的代码实现的。

        执行此操作时,您需要注意 DDL 在执行之前和之后都会发出隐式提交。

        【讨论】:

          猜你喜欢
          • 2022-01-23
          • 1970-01-01
          • 2012-11-05
          • 2012-03-17
          • 2020-01-30
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多