2011-08-02 29 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 –

相關問題