2013-02-27 25 views
1

這是代碼...這不是完整的代碼。我修剪下來到出現第一個錯誤,其中:ORA-06502:非常基本的字符串函數上的數字或值錯誤,給出了什麼?

FUNCTION get ( 
    p_sql_o       OUT VARCHAR2 
) RETURN VARCHAR2 AS 
    str_sql   VARCHAR2(4000); 
    BEGIN 
    str_sql := ' SELECT * FROM (SELECT A.*, ROWNUM RNUM FROM (' || 
       ' SELECT item_code, ' || 
       ' item_desc, ' || 
       ' monitor, ' || 
       ' measured, ' || 
       ' inventory, ' || 
       ' (measured - inventory) adj_amount, ' || 
       ' (inventory_cost * measured) measured_cost, ' || 
       'inventory'; 
    RETURN str_sql; 
    EXCEPTION 
    WHEN OTHERS THEN 
    RETURN NULL; 
    END get; 

顯然,SQL是不完整的,但我不運行它。我簡單地返回SQL字符串,但我仍然得到一個錯誤:

ORA-06502:PL/SQL:數字或值錯誤:字符串緩衝區太小 ORA-06512:在第6行

這是莫名其妙的。有沒有人有任何線索,爲什麼會這樣?

+3

你是否在get函數中出現錯誤?或者你是否在調用'get'函數的那一行獲得了錯誤?如果是後者,那就意味着調用者沒有爲該函數返回數據分配足夠大的字符串。另外,在函數中有一個'OUT'參數是非常奇怪的,除了'RETURN'語句之外,該名稱似乎還用於將SQL語句返回給調用者。這裏的OUT參數是完全多餘的。 – 2013-02-27 17:40:20

+0

p_sql_o的值是什麼? – 2013-02-27 17:40:32

+0

我可以運行這個沒有錯誤...所以是的,有點奇怪。你遠遠沒有接近4k的限制,所以即使你在UTF-16數據庫中運行它,字節數也不會達到4k。我懷疑你試圖把輸出放到一個太小的變量中。你怎麼打這個? – Ben 2013-02-27 17:40:40

回答

1

既然你說你是不是嘗試動態執行SQL你正在創造,那裏的內容的語法和正確性,或者它可能返回的長度,顯然是無關的。您沒有對p_sql_oOUT參數進行任何操作,因此也不會導致此問題。這只是真的使str_sql成爲罪魁禍首,正如Justin昨天暗示的那樣,它在函數內被聲明爲足夠大,函數本身編譯成OK - 所以它看起來像它被稱爲是問題。

你提到它的作品,如果你刪除'庫存',它將字符串的長度從201減少到192個字符,所以我猜你已經在調用者中將此設置設置爲200個字符,如下所示:

declare 
    str_sql varchar2(200); 
    p_sql_o varchar2(4000); 
begin 
    str_sql := get(p_sql_o); 
end; 
/

declare 
* 
ERROR at line 1: 
ORA-06502: PL/SQL: numeric or value error: character string buffer too small 
ORA-06512: at line 5 

注意,這是報告的行號是5,不6你了;這是調用者中有錯誤的行,而不是分配發生在函數內部的行。如果我在調用者聲明中創建了str_sql varchar2(250);,那麼它可以工作(但它可能是4000以匹配函數中的聲明)。

declare 
    str_sql varchar2(250); 
    p_sql_o varchar2(4000); 
begin 
    str_sql := get(p_sql_o); 
end; 
/

PL/SQL procedure successfully completed. 

p_sql_o仍然是空的,因爲你永遠不設置它。它看起來像OUT參數是多餘的。也許你打算把SQL字符串放到那裏,而這已經在調用者中聲明爲足夠大;但是不清楚返回值會是什麼 - 您可能只想完全刪除OUT參數,並確保調用程序中將返回值放入的變量足夠大。

+0

調試器實際上將返回設置爲200個字符。奇怪的是,當我試圖從.NET應用程序調用SQL字符串時......它做了同樣的事情。我不確定那裏是什麼罪魁禍首,但調試器實際上只設置了一個結果變量爲200個字符。越來越多,這有助於緩解這個問題。 – jlrolin 2013-02-28 13:35:54

0

您是否嘗試過僅針對SP之外的數據庫運行SQL腳本?這將有助於確定sql語法是否正確,並且您將返回所期望的內容。它看起來像你期望得到一個4000字節或更小的響應。你確定這是什麼被返回?我沒有看到Where子句。也許你正在返回多行超出你的限制?誠然,我不熟悉存儲過程,所以我可能會關閉。

0

在這裏,您使用p_sql_o作爲輸出參數,而不是在函數內部分配任何值。 因此,在調用此函數的行之後,p_sql_o將保留之前代碼中的值。

正如你所定義的,str_sql只能容納4000個字符,如果你的連接字符串超出了這個限制,它會給字符串緩衝區太小ORA-06512錯誤。

當您連接字符串以創建select語句時,請檢查您是正確使用單引號還是完全忽略它們。如果發生這種情況,然後在執行動態選擇語句可能會收到此錯誤ORA-06502:PL/SQL:數字或值錯誤:

相關問題