日期:2014-05-17  浏览次数:21136 次

求救pl/sql 游标 数据缓冲区太小异常
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字段长度不够。