问题描述:
生产环境中,有一个在报表自动刷新系统中排期的报表(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