1
4

1 回答 1

1

您的问题是游标循环中的变量始终tabletype基于游标定义。您需要指定要添加到数组中的表中的哪个字段:

v_owner_internal_id(MyRowPositionInVarray) := d_owner_internal_id.d_owner_internal_id;

同样,您的其他作业也需要更改:

v_internal_id(MyRowPositionInVarray) := d_owner_internal_id.d_internal_id;

显然,将游标循环使用的变量更改为不那么容易混淆的变量是个好主意。


您还可以通过使用光标定义一个数组来稍微简化一下:

TYPE t_rst1 IS VARRAY(500) OF cur_rst1%rowtype;
v_rst1 t_rst1 := t_rst1();
...
for r_rst1 in cur_rst1 loop
...
v_rst1(MyRowPositionInVarray) := r_rst1;
...
dbms_output.put_line(v_rst1(i).d_owner_internal_id || ',  ' ||  
                     v_rst1(i).d_internal_id || ',  ' ||  
                     v_rst1(i).d_tid || ',  ' ||  
                     v_rst1(i).d_entity_name || ',  ' ||  
                     v_rst1(i).d_form_seq); 

最后,您可以使用以下方法大大简化此操作bulk collect

DECLARE
  MyTID varchar2(10); 
CURSOR Cursor_rst1 IS
       SELECT d_owner_internal_id,
              d_internal_id,
              d_tid,
              d_entity_name,
              d_form_seq
         FROM rtns.itas_rtn_ct_1120_cor tblRecords
        WHERE d_form_seq = '2710' --Tax Year =2003
          AND D_TID = MyTID;  
  TYPE t_rst1 IS table OF Cursor_rst1%rowtype; 
  r_rst1 t_rst1;

  BEGIN  
  MyTID := '0000083';  

  open Cursor_rst1;
  fetch Cursor_rst1 bulk collect into r_rst1;
  close Cursor_rst1;

  FOR i IN r_rst1.first .. r_rst1.last LOOP
       dbms_output.put_line(r_rst1(i).d_owner_internal_id || ',  ' ||  
                            r_rst1(i).d_internal_id || ',  ' ||  
                            r_rst1(i).d_tid || ',  ' ||  
                            r_rst1(i).d_entity_name || ',  ' ||  
                            r_rst1(i).d_form_seq);  
  END LOOP;  
END;
于 2012-09-06T18:30:13.743 回答