动态 SQL 中绑定变量的限制

Posted

技术标签:

【中文标题】动态 SQL 中绑定变量的限制【英文标题】:Restrictions on binding variables in dynamic SQL 【发布时间】:2014-12-30 08:20:08 【问题描述】:

今天早上我尝试在动态 SQL 语句中绑定变量时遇到了一个棘手的情况。情况是 我试图在动态 SQL 块中多次使用同一个绑定变量

考虑以下代码:

create or replace function test_function (v1 number, v2 number)
    return sys_refcursor
is
    cur sys_refcursor;
    v_sql clob := 'select 1 as col1,'
                ||chr(10)||'       nvl ( (select ''a = 2'''
                ||chr(10)||'                from dual'
                ||chr(10)||'               where :a = 2),' -- First occurance of `a`
                ||chr(10)||'            ''a != 2'')'
                ||chr(10)||'           as col2,'
                ||chr(10)||'       nvl ( (select ''a = 3'''
                ||chr(10)||'                from dual'
                ||chr(10)||'               where :a = 3),' -- Second occurance of `a`
                ||chr(10)||'            ''a != 3'')'
                ||chr(10)||'           as col2'
                ||chr(10)||'  from dual'
                ||chr(10)||' where :b = 1'; -- another var `b` used just once
begin
    open cur for v_sql using v1, v2;
    return cur;
end;
/

然后我在 Toad 中运行以下语句:

select test_function (3, 1) from dual;

我得到错误:

ORA-01008: not all variables bound
ORA-06512: at "SCHEMA.TEST_FUNCTION", line 19

如果我修改动态 SQL 并删除第二次出现的绑定变量 a,它就可以工作。我尝试参考 Oracle 文档 here、here 和 here,但没有发现与此相关的任何内容。请帮忙。

【问题讨论】:

【参考方案1】:

在这种情况下,变量受位置约束,而不是名称。你必须像这样重复 v1 变量

open cut for v_sql using v1, v1, v2;

详细说明见http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm#BHCHIHEJ

【讨论】:

以上是关于动态 SQL 中绑定变量的限制的主要内容,如果未能解决你的问题,请参考以下文章

动态SQL绑定变量静态SQL的性能对比

动态sql与变量绑定

可以将绑定变量连接到动态 SQL WHERE 子句以添加 AND 语句吗?

动态 SQL 不存在绑定变量

Oracle - 如何使用动态绑定参数定义动态 SQL?

sql select语句作为动态plsql块的绑定变量