Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 截断存储过程中的表_Oracle_Stored Procedures_Plsql_Ddl - Fatal编程技术网

Oracle 截断存储过程中的表

Oracle 截断存储过程中的表,oracle,stored-procedures,plsql,ddl,Oracle,Stored Procedures,Plsql,Ddl,在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

在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   ;   :=
为什么?

请尝试下面的代码

execute immediate 'truncate table tablename' ;

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

execute immediate 'truncate table schema.tablename';

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

DBMS_UTILITY.EXEC_DDL_语句('TRUNCATE TABLE tablename;')

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


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

您应该知道,不可能像您在PL/SQL块中对DML那样直接运行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_语句(解析VARCHAR2中的字符串)


希望这能解释您的问题。

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