【问题标题】:execute immediate a pl/sql that having execute immediate立即执行一个立即执行的 pl/sql
【发布时间】:2019-01-29 16:04:08
【问题描述】:

我有一个立即执行的查询字符串。

如何立即执行此 PL/SQL?

查询字符串 = '执行立即选择....';

想要这样做:Execute immediate 'query string';

变成了这样:Execute immediate 'Execute immediate select ....;';

你知道我该怎么做吗?

【问题讨论】:

  • 一个更完整的例子会很有用。您的“查询字符串”缺少内部单引号;这是否存在于变量中?您打算如何处理查询结果?

标签: oracle plsql dynamic-sql


【解决方案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?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2023-03-31
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多