6

execute immediate与 DML 和 DDL 语句一起使用时,PL/SQL中的意义是什么?是否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;
4

2 回答 2

10

它用于运行本机动态 SQL

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

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

我想说很少需要从 PL/SQL 块中使用 DDL。TRUNCATE可能是合理的;如果您发现任何动态创建或删除对象的东西,那么这可能更令人担忧,因为它可能暗示一个次优的数据模型。

EXECUTE IMMEDIATE本身不会自动提交;但是如果你执行 DDL,那么它的行为与你在 PL/SQL 之外运行它的行为相同,所以它会在你的情况下提交,是的。

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

EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';

V_SQL_1根本不使用。

于 2013-08-22T09:46:32.560 回答
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 字符串语句中的绑定变量。

于 2013-08-22T09:11:12.700 回答