立即执行一个立即执行的 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的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQLPL/SQL过程

立即执行一个立即执行的 pl/sql

立即执行函数

前端面试之立即执行函数

立即执行函数

JS 立即执行函数