调试经验——ORA-06502: PL/SQL: numeric or value error: character string buffer too small的解决方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hpdlzu80100/article/details/83178410

问题描述:

生产环境中,有一个在报表自动刷新系统中排期的报表(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);),上述代码可成功运行,哦耶!

扫描二维码关注公众号,回复: 3664349 查看本文章

参考文章:

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

猜你喜欢

转载自blog.csdn.net/hpdlzu80100/article/details/83178410
今日推荐