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 块返回类型