DROP TABLE PRODUCTINFO_TMP;
CREATE TABLE PRODUCTINFO_TMP AS SELECT * FROM
productinfo WHERE 1=2;
ALTER TABLE PRODUCTINFO_TMP MODIFY category VARCHAR2(4000);
CREATE OR REPLACE PROCEDURE TEST123 AS
CURSOR cur_categoryinfo IS SELECT * FROM categoryinfo
WHERE categoryname IN('MP3','ROUTER','WASHING MACHINE','TV');
CURSOR cur_productinfo(category_id VARCHAR) IS SELECT * FROM productinfo
WHERE productprice >1000 AND origin IN('CHINA','HANGZHOU')
AND category = category_id;
BEGIN
<<outer>>
FOR cur_cate IN cur_categoryinfo LOOP
<<inner>>
FOR cur_pro IN cur_productinfo(cur_cate.categoryid) LOOP
-- cur_pro.category := cur_cate.categoryname;
IF cur_pro.productprice>2000 THEN
cur_pro.productprice := cur_pro.productprice*0.95;
END IF;
-- insertinto productinfo_tmp values cur_pro;
INSERT INTO productinfo_tmp(productid,productprice,category)
VALUES (cur_pro.productid,cur_pro.productprice,cur_cate.categoryname);
END LOOP inner;
END LOOP outer;
COMMIT;
END;
/
本来我用的是这两个注释掉的source,但在第一个注释的地方,运行几次循环后就报如下异常了
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
我是想把本来是种类id(数字形式)存储的换成种类名字,我看了下id和名字都是varcha2的,并且我上面声明了4000,为什么还会报错啊,求救
另外如果不用那两个注释程序是对的。
------解决方案--------------------
1、cur_productinfo 表里面的 category字段是不是number的?把非数字放到数字类型就会报这个错。
2、cur_productinfo 表里面的 category字段长度不够。