动态SQL中绑定变量的限制

时间:2014-12-30 08:20:09

标签: oracle oracle11g dynamic-sql bind-variables

今天早上,当我尝试在动态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文档hereherehere,但没有发现与此相关的内容。请帮忙。

1 个答案:

答案 0 :(得分:1)

在这种情况下,变量是按位置绑定的,而不是按名称绑定的。你必须像这样重复v1变量

open cut for v_sql using v1, v1, v2;

请参阅http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm#BHCHIHEJ

中的详细说明