当我在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 ; :=
为什么?
答案 0 :(得分:101)
Oracle PL / SQL中的所有DDL语句都应在语句之前使用Execute Immediate。因此你应该使用:
execute immediate 'truncate table schema.tablename';
答案 1 :(得分:17)
除了立即执行,您还可以使用
DBMS_UTILITY.EXEC_DDL_STATEMENT('TRUNCATE TABLE tablename;');
语句失败,因为存储的proc正在执行DDL,而DDL的某些实例可能使存储的proc无效。通过使用execute immediate或exec_ddl方法,DDL通过未解析的代码实现。
执行此操作时,您需要注意DDL在执行之前和之后都发出隐式提交的事实。
答案 2 :(得分:11)
尝试以下代码
execute immediate 'truncate table tablename' ;
答案 3 :(得分:10)
你应该知道不可能直接运行DDL语句,就像你从PL / SQL块那样运行DML,因为PL / SQL不支持后期绑定,它只支持编译时绑定,这对于DML来说很好。因此,为了克服这类问题,oracle提供了一种动态SQL方法,可用于执行DDL语句。动态sql方法是在运行时解析和绑定sql字符串。 此外,您应该记住DDL语句默认是自动提交,因此如果您在执行DDL之前有一些DML(需要使用TCL显式提交),则应该注意使用动态SQL方法的任何DDL语句。存储过程/功能。
您可以使用以下任何动态SQL方法从pl / sql块执行DDL语句。
1)立即执行
2)DBMS_SQL包
3)DBMS_UTILITY.EXEC_DDL_STATEMENT(parse_string IN VARCHAR2);
希望这能解释你的问题。