我的环境是Oracle9i Enterprise Edition Release 9.2.0.1.0  。
 我原来的代码是:
declare          
  Type TDetails is table of Ordersdetail%rowtype index by pls_integer;
  Type Torderid_tab_t is table of ordersdetail.orderid%type index by Pls_Integer;
  Type Tgoodsid_tab_t is table of ordersdetail.goodsid%type index by pls_integer;
  
  ODetails TDetails;   
  orderid_t Torderid_tab_t;
  goodsid_t tgoodsid_tab_t;
  L pls_integer;      
begin
  -- Test statements here
  select * bulk collect into ODetails from Ordersdetail 
                      order by Orderid,Goodsid;                        
  for r in ODetails.First..ODetails.Last loop
    Dbms_Output.put_line(ODetails(r).Goodsid);  
    exit when r>10;
  end loop; 
  
  -----------------------------------------------------------------------------
  --不知道为什么,下面这个会产生错误。"bulk in-bind"  
  --  Oracle9i Enterprise Edition Release 9.2.0.1.0  
  -----------------------------------------------------------------------------                 
  forall L in ODetails.First..ODetails.Last
     update ordersdetail  set amount=amount-1,salemoney=(amounT-1)*saleprice
             where orderid=ODetails(L).orderid and
                   goodsid=ODetails(L).goodsid;
  Commit;             
  
end;
------------------------------------------------------------------------------------
  后来发现必须把错误的部分修改为如下的才可以。
  select orderid,goodsid bulk collect into orderid_t,goodsid_t from Ordersdetail 
                      order by Orderid,Goodsid;
                      
  forall L in orderid_t.First..orderid_t.Last
     update ordersdetail  set amount=amount-1,salemoney=(amounT-1)*saleprice
             where orderid=orderid_t(L) and
                   goodsid=goodsid_t(L);
  --------------------------------------------------------------------------
  按照技术文档,应该在这个版本是可以的(还是说,我看错了?)。
  有没有哪位大侠知道是怎么回事的。

解决方案 »

  1.   

    和你版本一样,没问题的啊Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0 SQL> DECLARE
      2  type t_test is table of test%rowtype;
      3  v_test t_test;
      4  BEGIN
      5  select * bulk collect into v_test from test;
      6  FOR i IN v_test.FIRST .. v_test.last
      7  LOOP
      8  dbms_output.put_line(v_test(i).ID || ',' || v_test(i).col1 || ','  || v_test(i).col2);
      9  END LOOP;
     10  end;
     11  /PL/SQL procedure successfully completed
      

  2.   

    如果不涉及到dml语句,是没有问题的。如果和您那样,也是没有问题。但问题不是这样的。
      

  3.   

    select * bulk collect into ODetails from Ordersdetail 
                          order by Orderid,Goodsid;   
      后来发现必须把错误的部分修改为如下的才可以。
      select orderid,goodsid bulk collect into orderid_t,goodsid_t from Ordersdetail 
                          order by Orderid,Goodsid;你比较下上面你修改前后的应该知道为什么。