为什么不能直接在PL/SQL块中写入ddl语句

Rav*_*avi 11 oracle plsql ddl

为什么不能直接在PL/SQL块里写ddl语句,比如我写的时候

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name; // error
END test;
/
Run Code Online (Sandbox Code Playgroud)

但,

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    execute immediate 'truncate table table_name'; // works fine
END test;
/
Run Code Online (Sandbox Code Playgroud)

为什么第二个执行成功?

Phi*_*lᵀᴹ 7

正如文档中所说:

只有动态 SQL 才能在 PL/SQL 程序单元中执行以下类型的语句:

  • 数据定义语言 (DDL) 语句,例如 CREATE、DROP、GRANT 和 REVOKE

一个TRUNCATE操作是DDL

使用时EXECUTE IMMEDIATE,请记住,DDL您执行的任何操作都将隐式执行COMMIT当前事务。