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