在查询一个视图的过程中,提示错误
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是按字节来取值,当所取长度为奇数时,则自动舍弃最后一位字节。