EXECUTE IMMEDIATE 中的 SQL 语句是不是在运行时解析?

Posted

技术标签:

【中文标题】EXECUTE IMMEDIATE 中的 SQL 语句是不是在运行时解析?【英文标题】:Is SQL statement in EXECUTE IMMEDIATE parsed at run time?EXECUTE IMMEDIATE 中的 SQL 语句是否在运行时解析? 【发布时间】:2017-12-14 09:08:32 【问题描述】:

考虑以下程序。对于处理,它无论如何都必须经过所有处理阶段。所以我的问题是:在这个解析阶段'Select job_id from asfd' 是否仍然被视为字符串,而EXECUTE IMMEDIATE 的执行阶段语句'Select job_id from asfd' 现在再次被解析为SQL 语句?

CREATE OR REPLACE PROCEDURE test_ei
IS
BEGIN
EXECUTE IMMEDIATE ‘select job_id from asfd’;  //line 3
END;

我在here 中找到的一个解释是asdf 表不存在但gut 已成功编译,因此'Select job_id from asfd' 在此阶段仍被视为字符串。请大家指正。

事实上,即使 EXECUTE IMMEDIATE 'select * asfd'; 在第 3 行被替换,它仍然可以成功。所以我猜上面的解释是正确的。

【问题讨论】:

一些关于不同阶段的有用信息:[link]docs.oracle.com/cd/A57673_01/DOC/server/doc/A48506/sqlconce.htm 是的,在程序解析时,'select job_id from asfd'没有被解析,它只在运行时被解析。 【参考方案1】:

是的。在 EXECUTE IMMEDIATE 时,运行时引擎必须首先解析语句。也就是不能在模式元素(表、列等)的名称中绑定的原因

更多详情: 解析阶段保证了正确定义 SQL 语句。 PL/SQL 无需知道:xyz 的值就可以判断以下语句是有效的。

'UPDATE emp SET sal = :xyz'

但是 PL/SQL 怎么知道下面的语句是否格式正确呢?我们不能,所以限制。

'UPDATE emp SET :col_name = :xyz'

【讨论】:

以上是关于EXECUTE IMMEDIATE 中的 SQL 语句是不是在运行时解析?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中动态SQL详解(EXECUTE IMMEDIATE)

在 PL\SQL 块中使用 EXECUTE IMMEDIATE

EXECUTE IMMEDIATE PL/SQL 块返回类型

PL/SQL里 execute immediate的用法 谁给解释下

ORACLE EXECUTE IMMEDIATE 小结

Oracle中Execute Immediate用法