58

当我在 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   ;   :=

为什么?

4

4 回答 4

113

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

execute immediate 'truncate table schema.tablename';
于 2009-03-09T11:00:38.377 回答
18

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

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

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

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

于 2009-03-09T12:07:00.103 回答
12

试试下面的代码

execute immediate 'truncate table tablename' ;
于 2009-03-09T10:38:44.013 回答
10

您应该知道,不可能像从 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);

希望这能用解释回答你的问题。

于 2013-02-15T18:46:20.587 回答