今天早上,当我尝试在动态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,但没有发现与此相关的内容。请帮忙。
答案 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
中的详细说明