【问题标题】:Native Dynamic SQL, creating string原生动态 SQL,创建字符串
【发布时间】:2016-08-05 22:31:06
【问题描述】:

我刚刚开始使用 PL/SQL。我的担忧如下:

我想动态创建一个字符串。

我尝试了以下方法,但它总是在“立即执行...”行中导致 ORA-00900 和 ORA-06512。

我们开始吧:

    Declare

    l_pre_sql varchar2(4000) := 'schema.';
    l_sql varchar2(4000) := 'concat(concat(:a, :b), :c)';
    l_after_sql := '.procedure(a,b,c)';
begin

execute immediate l_sql using l_pre_sql, l_sql, l_after_sql;

end;

execute immediate 的语法错了吗?还有其他工作机会吗?如您所见,我正在解决不能将模式名称用作动态变量的问题。

为了澄清,我基本上想这样做:

execute immediate ':a'||'.'||':b'||'.procedure(a,b,c)' using schema, name;

提前致谢!

【问题讨论】:

  • 你为什么不直接打电话给EXECUTE IMMEDIATE l_pre_sql||l_after_sql?你现在打电话的是concat(concat(schema.,concat(concat(:a,:b), :c), .procedure(a,b,c)),这完全没有意义。
  • 模式名和变量名不能作为绑定变量。它会类似于 eval 内的 eval。

标签: sql oracle dynamic plsql


【解决方案1】:

在准备好的语句中(在 Oracle 和其他语言中),您可以使用参数替换查询字符串中的常量值。但是,您不能替换列名、表名、用户(模式)、过程名等。

换句话说,替换不仅仅是用字符串表示替换值。它是将参数插入到编译语句中。

所以,你需要先用过程名构造字符串,然后调用它。

我认为你想要的是这样的:

execute immediate l_pre_sql || l_after_sql || '(:a, :b, :c)' using . . .

【讨论】:

  • 您好,首先感谢您的回答。我知道不允许用我的给定示例替换用户和过程名称。我必须承认我在第一篇文章中欺骗了自己。我有点着急,请原谅。我喜欢做的是动态调用几个包中的过程。假设我在要调用的每个包中都有一个过程“版本”。现在我想要一个动态的 sql 语句来替换包名。我可以在这里使用变量吗?因为我尝试的所有方法(以上只是一个坏例子)都失败了。
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2021-03-29
  • 1970-01-01
相关资源
最近更新 更多