除錯經驗——ORA-06502: PL/SQL: numeric or value error: character string buffer too small的解決方法
阿新 • • 發佈:2018-10-31
問題描述:
生產環境中,有一個在報表自動刷新系統中排期的報表(scheduled report)生成失敗。
報以下錯誤:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "PABORACLE_P.CONCATENATE_LIST", line 11
經過一番比較艱苦的排查,現查明,問題出在了自定義函式(T_LIST_OF_STRINGS )中的varchar2字元引數設定的不夠大(低於6000,而實際資料最大能達到8000)。
解決方法:
將自定義函式中的字元數引數設定為更大的數字(最大32767),但需注意,這一設定和Oracle的版本有關係(Oracle 10g最大為4000, Oracle 12 可達32767)
以下為示例程式碼:
現有的自定義函式中,返回的連線後的字串的長度設定為10(l_return VARCHAR2(10);)
CREATE OR REPLACE FUNCTION concatenate_list (p_cursor IN SYS_REFCURSOR) RETURN VARCHAR2 IS l_return VARCHAR2(10); l_temp VARCHAR2(10); BEGIN LOOP FETCH p_cursor INTO l_temp; EXIT WHEN p_cursor%NOTFOUND; l_return := l_return || ', ' || l_temp; END LOOP; RETURN LTRIM(l_return, ', '); END;
執行以下程式碼,
SELECT e1.deptno,
concatenate_list(CURSOR(SELECT e2.ename FROM emp e2 WHERE e2.deptno = e1.deptno)) employees
FROM emp e1
GROUP BY e1.deptno;
將會報以下錯誤:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "PABORACLE_P.CONCATENATE_LIST", line 11
如果將自定義函式中返回的連線後的字串的長度設定為100(l_return VARCHAR2(100);),上述程式碼可成功執行,哦耶!
參考文章:
https://blog.csdn.net/hpdlzu80100/article/details/83147427
https://stackoverflow.com/questions/25237463/what-is-the-max-size-of-varchar2-in-pl-sql-and-sql