立即执行一个立即执行的 pl/sql
Posted
技术标签:
【中文标题】立即执行一个立即执行的 pl/sql【英文标题】:execute immediate a pl/sql that having execute immediate 【发布时间】:2019-01-29 16:04:08 【问题描述】:我有一个立即执行的查询字符串。
如何立即执行此 PL/SQL?
查询字符串 = '执行立即选择....';
想要这样做:Execute immediate 'query string';
变成了这样:Execute immediate 'Execute immediate select ....;';
你知道我该怎么做吗?
【问题讨论】:
一个更完整的例子会很有用。您的“查询字符串”缺少内部单引号;这是否存在于变量中?您打算如何处理查询结果? 【参考方案1】:不评论是否正常或明智:是的,我相信你可以做到。也就是说,我从未见过任何关于 EXECUTE IMMEDIATE
的文章表明它不是可重入的。另外,如果您尝试它,它会起作用。
这是一个简单、典型的EXECUTE IMMEDIATE
调用:
DECLARE
l_count NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) INTO :l_count FROM DBA_OBJECTS WHERE ROWNUM <= 100' INTO l_count;
DBMS_OUTPUT.PUT_LINE ('l_count = ' || l_count);
END;
这里基本上是一样的,但是 EXECUTE IMMEDIATE
调用嵌套到两个级别:
DECLARE
l_outer_count NUMBER;
BEGIN
EXECUTE IMMEDIATE q'!
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) INTO :x FROM DBA_OBJECTS WHERE ROWNUM <= 100' INTO :l_outer_count;
END;
!'
USING IN OUT l_outer_count;
DBMS_OUTPUT.PUT_LINE('l_outer_count = ' || l_outer_count);
END;
我从来没有遇到过这样做的需要。
【讨论】:
如果我们有一些可能包含 1 个参数或 3 个参数的参数,如何使用 pl/sql 执行此操作? 我想这样做:declare m varchar2(1000) := 'SELECT description FROM TB1 WHERE id= :z'; u number := 5; EXECUTE IMMEDIATE '||m||' INTO :l_outer_count using '|| u || ';
动态构造一个 PL/SQL 块来处理绑定变量数量的变化非常有意义。不过,我不确定为什么需要在立即执行中执行立即执行。您正在运行时构建代码块。为什么需要在动态构造的字符串中执行动态 SQL?以上是关于立即执行一个立即执行的 pl/sql的主要内容,如果未能解决你的问题,请参考以下文章