动态 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 中绑定变量的限制的主要内容,如果未能解决你的问题,请参考以下文章