当前位置:  开发笔记 > 编程语言 > 正文

截断存储过程中的表

如何解决《截断存储过程中的表》经验,为你挑选了4个好方法。

当我在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



1> Dheer..:

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

execute immediate 'truncate table schema.tablename';



2> stjohnroe..:

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

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

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

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



3> serioys sam..:

试试下面的代码

execute immediate 'truncate table tablename' ;



4> Gourabp..:

您应该知道不可能像从PL/SQL块那样直接运行DDL语句,因为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);

希望这能解释你的问题.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有