Oracle:'execute immediate' 是什么意思?

7

execute immediate在PL/SQL中与DML和DDL语句一起使用有什么意义?当使用DDL语句时,execute immediate是否像DDL语句一样隐式提交到数据库?

以下是我遇到的一个示例:

SELECT 'TRUNCATE TABLE BD_BIDS_APPR_DET' INTO V_SQL1 FROM DUAL;
EXECUTE IMMEDIATE V_SQL1;

SELECT 'TRUNCATE TABLE BD_BIDS_SYS_DET' INTO V_SQL1 FROM DUAL;
EXECUTE IMMEDIATE V_SQL1;

SELECT 'TRUNCATE TABLE BD_BIDS_EXT_DET' INTO V_SQL1 FROM DUAL;
EXECUTE IMMEDIATE V_SQL1;
2个回答

10

它用于运行本地 动态SQL

对于DML,当运行不在编译时可用的语句时,例如如果列列表基于用户的选择,则需要使用它。

在您的情况下,它被用于DDL不能作为静态SQL从PL/SQL内部运行的情况。只有某些查询、DML和TCL命令是有效的。其他任何内容都必须视为动态内容。

我认为很少需要从PL/SQL块中使用DDL。可能会考虑使用TRUNCATE;如果发现任何在程序运行时创建或删除对象的情况,则这可能更令人关注,因为它可能暗示着一个次优的数据模型。

EXECUTE IMMEDIATE 本身不会自动提交;但是,如果执行DDL,则会像在PL/SQL之外运行一样执行,因此在您的情况下会提交。

顺便说一句,我不确定为什么您的代码要使用一个中间变量来保存语句;如果您想要显示它将要运行的内容,那么这可能很有用,但您似乎并没有这样做。您可以像下面这样处理:

EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';

即不使用V_SQL_1


我没有开发这段代码。我猜想一定有某些强有力的原因。好答案! - Abhishek Singh

2

当执行动态SQL语句或匿名PL/SQL块时,它提供了端到端的支持。它替换未知值、执行语句、返回数据,然后释放资源。

EXECUTE IMMEDIATE [dynamic SQL string statement without terminator]

 [INTO {define_variable     [, define_variable] ... | record}]

 [USING [IN|OUT|IN OUT] bind_argument [, [IN|OUT|IN OUT] bind_arguments] ];

define_variable是一个PL/SQL变量或记录,用于捕获SELECT查询的结果集。

绑定参数是实际值或本地变量,它们将替换SQL字符串语句中的绑定变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接