本帖最后由 xzjjmaomao 于 2011-07-14 13:34:06 编辑

解决方案 »

  1.   

    forall i in 1..v_sum------------这里for i in 1..v_sum
      

  2.   

      for   i in  1..num   loop 
      INSERT INTO B 
        values
          (i);
         commit;
         end loop;
      

  3.   


    forall i in 1..v_sum这报异常了,改成:forall i in v_id.FIRST..v_id.LAST
      

  4.   


    for i in 1..10 LOOP 
    /*操作*/
    END LOOP
    这种我知道,也没问题。
    可是现在是用的forall ,看网上都这么写的。不知道为什么错了。还是网上的都写错了?不可能吧。
    请问如果用forall怎么写?
      

  5.   


    改为
    forall i in v_id.first..v_id.last还是错
      

  6.   

    应该是v_type, v_id的count 不一致导致的,假设v_type.count=5,v_id.count=3的话
    那么你的insert 是有问题的,循环取v_id(4)时就有问题了楼主可以验证下是不是这个原因引起的,如果是的话 先申明记录类型的变量
    type compare is record(
    name varchar2(30),--查询项名称,
    num number --数量
    );
    type cxjg_tab is table of compare index by binary_integer;-这样应该就不会出问题了
      

  7.   


    加上
    DBMS_OUTPUT.put_line(v_id.count);
       DBMS_OUTPUT.put_line(v_type.count);输出结果:9
             9
    是一致的。
    type compare is record(
    name varchar2(30),--查询项名称,
    num number --数量
    );
    type cxjg_tab is table of compare index by binary_integer;-申明记录类型的变量什么意思?
      

  8.   

    代码没有什么问题,oracle什么版本?
      

  9.   


    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Prod
    PL/SQL Release 10.1.0.2.0 - Production
    CORE 10.1.0.2.0 Production
    TNS for 32-bit Windows: Version 10.1.0.2.0 - Production
    NLSRTL Version 10.1.0.2.0 - Production
      

  10.   


    create or replace procedure UPDATE_MERAREA is
      v_sum number;
      type t_type is table of A.MGRAREA%type;   --这里定义的是字段 MGRAREA 类型
      v_type t_type;
      type t_id is table of A.ID_OWNER%type;
      v_id t_id;
    begin
      SELECT mgrarea, id_owner BULK COLLECT
        INTO v_type, v_id
        FROM A   
       where rownum < 10;
      v_sum:=v_id.count;
      forall i in  1..v_sum  
      INSERT INTO B(ID_OWNER, owner_type)   --这里要插入 owner_type 这个字段,类型不一样吧。
        values
          (v_id(i), v_type(i));
     exception
      when others then
        rollback;
        DBMS_OUTPUT.put_line(sqlerrm);
    end UPDATE_MERAREA;
      

  11.   


    --查查两个表的表结构,看是否是一至的。
    --你可以试试改成下面的结果看看是否还报错
    forall i in  1..v_sum  
      dbms_output.put_line(v_id(i));
      dbms_output.put_line(v_type(i));
      

  12.   

    --表达错了。意思就是让你打印一下结果看看
    for i in  1..v_sum loop
    dbms_output.put_line(v_id(i));
    dbms_output.put_line(v_type(i));
    end loop;
      

  13.   

    把你的打印结果,以及表B的结构贴出来看看。DESC B;
      

  14.   


    B表结构
    Name       Type         Nullable Default Comments 
    ---------- ------------ -------- ------- -------- 
    ID_OWNER   VARCHAR2(32)                   
    MGRAREA    VARCHAR2(30) Y                
    打印结果
    130002414
    4566321,896654331
    130005457
    1023543,78954654
      

  15.   

    A表中的两个字段
    ID_OWNER和MGRAREA和B表中的这两个字段类型一样,都是vachar2,只是长度不一样。A表中ID_OWNER长度是50,mgrarea是10
      

  16.   


    --测试了一下,没发现什么问题,应该是数据和字段类型的原因
    CREATE TABLE a(
      MGRAREA VARCHAR2(30),
      ID_OWNER VARCHAR2(30)
    );
    CREATE TABLE b(
      ID_OWNER VARCHAR2(30),
      OWNER_TYPE VARCHAR2(30)
    );INSERT INTO a VALUES('123123','213123');
    INSERT INTO a VALUES('12334','445345');
    INSERT INTO a VALUES('123123','12323443');
    INSERT INTO a VALUES('2342','4545');
    INSERT INTO a VALUES('234234','213123');CREATE OR REPLACE PROCEDURE UPDATE_MERAREA IS
      V_SUM NUMBER;
      TYPE T_TYPE IS TABLE OF A.MGRAREA%TYPE;
      V_TYPE T_TYPE;
      TYPE T_ID IS TABLE OF A.ID_OWNER%TYPE;
      V_ID T_ID;
    BEGIN
      SELECT MGRAREA, ID_OWNER BULK COLLECT
        INTO V_TYPE, V_ID
        FROM A
       WHERE ROWNUM < 10;
      V_SUM := V_ID.COUNT;
      FORALL I IN 1 .. V_SUM
        INSERT INTO B (ID_OWNER, OWNER_TYPE) VALUES (V_ID(I), V_TYPE(I));
      COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
    END UPDATE_MERAREA;
      

  17.   

    问题不知道算不算解决了。现在做下总结,省得别人走弯路了。同样的代码,连了下其它机器上的oracle,执行编译都没问题。也运行成功。不过自己的机器上还是不行。不明白为什么。最后决定重装数据库了 :(特别感谢下BenChiM888
    jym2002
    还有所有参与的童鞋们。
      

  18.   

    问题不再forall 上面  而是你的insert语句错误,你检查一下insert吧,因为是块儿插入所以那报错。