1. 程式人生 > >除錯經驗——ORA-06502: PL/SQL: numeric or value error: character string buffer too small的解決方法

除錯經驗——ORA-06502: PL/SQL: numeric or value error: character string buffer too small的解決方法

問題描述:

生產環境中,有一個在報表自動刷新系統中排期的報表(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