在存储过程中截断表

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

为什么?

谢谢,Klas Mellbourn

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

 execute immediate 'truncate table schema.tablename'; 

以及立即执行,你也可以使用

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

该语句失败,因为存储的proc正在执行DDL,并且某些DDL实例可能会使存储的proc失效。 通过使用execute immediate或exec_ddl方法,DDL通过未分离的代码实现。

当你这样做的时候,你需要注意DDL在执行之前和之后发出隐式提交的事实。

您应该知道,从PL / SQL块直接运行DDL语句是不可能的,因为PL / SQL不直接支持后期绑定,它只支持对DML很好的编译时绑定。 因此为了克服这种types的问题,oracle提供了一个可以用来执行DDL语句的dynamicSQL方法。dynamicsql方法是关于在运行时parsing和绑定sqlstring的。 另外,您应该记住DDL语句默认为自动提交,因此,在执行DDL之前,如果您有一些DML(需要使用TCL明确提交),则应该注意使用dynamicSQL方法的任何DDL语句存储proc /function。

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

1)立即执行

2)DBMS_SQL包

3)DBMS_UTILITY.EXEC_DDL_STATEMENT(parse_string IN VARCHAR2);

希望这个答案解释你的问题。

尝试下面的代码

 execute immediate 'truncate table tablename' ;