今天在处理问题时发现了一个问题,在执行包里一段存储过程时抛出的问题:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small。
出错环境:
定义了一个临时变量
L_CONTRACT_NAME VARCHAR2(50); --协议名称
抛出异常的地方:
SELECT IFCH.CONTRACT_ID, IFCH.CONTRACT_NAME, IFCH.CONTRACT_CODE
INTO L_CONTRACT_ID, L_CONTRACT_NAME, L_CONTRACT_CODE
FROM IES_FRAME_CONTRACT_H IFCH, IES_FRAME_CONTRACT_L IFCL
WHERE IFCH.CONTRACT_ID = IFCL.CONTRACT_ID
AND IFCH.VENDOR_ID = REC.VENDOR_ID
AND IFCL.ITEM_ID = L_ITEM_ID
AND SYSDATE BETWEEN IFCH.START_DATE_ACTIVE AND NVL(IFCH.END_DATE_ACTIVE, SYSDATE)
AND IFCL.CONTRACT_STATE = 1;
出错原因:
IES_FRAME_CONTRACT_H 中查询出来的记录,CONTRACT_NAME字段的数据是30个汉字。大于临时变量L_CONTRACT_NAME所能承载的量(50个字节=25个汉字)。
防止出错的办法:定义临时变量时参考所对应表的字段的大小
扩展学习:
SQL> DECLARE 2 v_test VARCHAR2(1); 3 BEGIN 4 v_test := 'bananas'; 5 END; 6 / DECLARE * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06512: at line 4 SQL> CREATE TABLE bananas (name VARCHAR2(1)); Table created. SQL> INSERT INTO bananas (name) VALUES ('One banana two banana'); INSERT INTO bananas (name) VALUES ('One banana two banana') * ERROR at line 1: ORA-01401: inserted value too large for column