ORA-06502: PL/SQL: 数字或值错误 : character string buffer too small ORA-0651的问题解决方法

在查询一个视图的过程中,提示错误

ORA-06502: PL/SQL: 数字或值错误 : character string buffer too small ORA-0651。

这个错误通常表示在PL/SQL代码中,尝试将一个太大的字符串赋值给一个太小的变量。那我们怎么定位这个问题呢,我们可以通过二分法,排查sql语句查询定位到哪个字段的字符串长度已经超出范围

SELECT MZZD,
        RYZD,
        CYZD,
        RYZZTZ,
        JCHZ,
        TSJC,
        ZLGC,
        HBZ,
        CYQK,
        CYYZ,
      -- ZLJG,--这个字段导出了这个错误
        ZZYSGH,
        ZZYSXM,
        ZYYSGH,
        ZYYSXM,
        XGBZ,
        CYZYSX,
        KFZD
   FROM WDPTJK.TB_CIS_LEAVEHOSPITAL_SUMMARY A
  WHERE TO_DATE(CYSJ, 'yyyymmdd') >= TO_DATE('20240214', 'yyyymmdd')
    AND TO_DATE(CYSJ, 'yyyymmdd') < TO_DATE('20240216', 'yyyymmdd');

一、查询数据库编码
方式一:select userenv('language') from dual;
查询结果是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,是适用于中国的中文字符集,只能存储中文和英文字符。
方式二:select * from V$NLS_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
查询结果是ZHS16GBK,NLS_CHARACTERSET是指数据库字符集。
CHAR:固定长度,输入不足长度的字符将自动用空格补足,区分中英文,一个中文占用2个字节,一个英文占用1个字节。
VARCHAR:可变长度,最终长度决定于输入多少长度的字符,区分中英文,一个中文占用2个字节,一个英文占用1个字节。
VARCHAR2:可变长度,最终长度决定于输入多少长度的字符,区分中英文,一个中文占用2个字节,一个英文占用1个字节。与VARCHAR的区别在于VARCHAR2不区分null和空字符串,而VARCHAR区分,null不分配内存,空字符串占长度0。
NVARCHAR2:可变长度,最终长度决定于输入多少长度的字符,不区分中英文,一个英文/中文占用2个字节。
以上默认byte类型。
VARCHAR2(CHAR):可变长度,无论是英文还是中文都占1个字节,看成为一个字符。

VARCHAR2字符下查询长度:
select length('好好学习') from dual;
查询结果为4。
select lengthb('好好学习') from dual;
查询结果为8。
select length('1234ok') from dual;
查询结果为6。
select lengthb('1234ok') from dual;
查询结果为6。


 

VARCHAR2类型的字段在Oracle数据库中最大的存储长度为4000字节。视图中的sql语句的value是clob字段,substr(value,2000)刚好2000个字,就可以解决ORA-06502: PL/SQL: 数字或值错误 : character string buffer too small ORA-0651这个错误。


————————————————

substr和substrb的区别

substr,substrb均为字符串截取函数,对于字母来说,substr与substrb作用时一样的,但对于汉字来说,substr是按字来取值,而substrb是按字节来取值,当所取长度为奇数时,则自动舍弃最后一位字节。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值