2011-08-02 47 views
1

当我为execute immediate构建动态SQL语句时,我想使用绑定变量而不是字符串连接。为什么我不能在execute immediate语句中使用绑定变量?

在下面的示例中,我可以使用绑定变量abret,但是当我尝试绑定为f,我收到了ORA-06502: PL/SQL: numeric or value error: character to number conversion error。为什么以及我如何绑定f

我正在使用11.2.0.1.0。

create or replace function so4fun (
    a in number, 
    b in number, 
    f in varchar2 
) return number as 
    decl constant varchar2(32767) := 
    'declare a constant number := :a; b constant number := :b;'; 
    stmt varchar2(32676); 
    ret number; 
begin 
    /* This one works: */ 
    stmt := decl || ' begin :result := ' || f || '; end;'; 
    execute immediate stmt using in a, in b, out ret; 

    /* But why this one doesn't ? 

    stmt := decl || ' begin :result := :f; end;'; 
    execute immediate stmt using in a, in b, out ret, in f; 

    This doesn't work either: 

    stmt := decl || ' tmp number; begin tmp := :f; :result := tmp; end;'; 
    execute immediate stmt using in a, in b, in f, out ret; 

    Both are giving me ORA-06502: PL/SQL: numeric or value error: character to 
    number conversion error */ 

    return ret; 
end; 
/
show errors 

/* expected result when a = 1, b = 2 is 1.5 */ 
select so4fun(1, 2, '(a + b)/b') from dual; 

drop function so4fun; 
+0

我选择了Codo的答案,因为我看到他的答案更加全面和紧凑。不过,我也发现Ray Toal的回答很有用,我也可以从他的回答中总结出我的问题的答案。我希望他们两个都有很多赞扬! – user272735

回答

2

绑定变量用于绑定变量,而不用于绑定代码段。这个想法是,Oracle可以编译和缓存查询或代码块,并使用不同的参数执行多次。

但是,您尝试使用参数绑定来替换计算出的公式。它会阻止编译和缓存代码块,因此不受支持。

此外,它不能用当前语法来表示。如果Oracle看到tmp := :f它认为您简单地想要将参数f分配给变量tmp。它不期望必须评估一个函数。

只是去工作的解决方案。它毕竟有效。

1

错误的发生是因为你宣布fvarchar2,但你已经写在你的注释掉的部分,如下:

tmp number; begin tmp := :f ... 

在其中尝试分配的“性格”的价值一个期望数字的变量。您还尝试将f分配给再次期待数字的函数结果。

事情与||工作正常,因为这是字符串连接。

你以某种方式需要将你的varchar2转换为数字(TO_NUMBER(f)),或者编写你的proc来接受参数f作为数字而不是varchar2。

+0

因此,Oracle在帮我一个忙,它检查一个绑定变量是一种正确的类型?在'f'的情况下,我的意图是生成一个像'begin:result:=(a + b)/ b; end;'但是它失败了,因为':result'被绑定到一个数字,并且绑定发生时'(a + b)/ b'是一个varchar2? – user272735

+2

Ohhhhh你想'f'是varchar2'“(a + b)/ b”'?也就是说,'f'是你想要评估的字符串的文本?在这种情况下绑定是不合适的,你应该去字符串连接。或者看看这里是否有帮助:http://asktom.oracle.com/pls/asktom/f?p=100:11:4121852961219206::::P11_QUESTION_ID:1179235402134 –

相关问题