1

我在一个包中声明了以下类型。

TYPE l_task_type_rec is record (task_id number, creation_date date);

TYPE tas_tab is table of l_task_type_rec;

l_task_rec tas_tab;

我正在尝试使用 for 循环来遍历表类型对象中的对象,如下所示。我不确定这是否可能。

for counter in l_task_rec.first ..l_task_rec.last

loop

    select task_id into l_task_id from l_task_rec where rowid = counter;

    select location_id into p_location_id from csf_ct_tasks where task_id = l_task_id;

    OPEN c_location_rec (p_location_id);

                    FETCH c_location_rec

                    BULK COLLECT INTO x_location_rec;

     CLOSE c_location_rec;

end loop;

我想要的是从 for 循环内部调用一个游标,以便我可以一一获取所有位置的列表,并以记录类型获取并存储所有数据。我知道搜索表类型的查询是错误的,因为它说表或视图 l_task_rec 不存在!谁能告诉我我在这里做错了什么或指出我正确的方向?提前致谢..

4

1 回答 1

1

这是一个如何迭代表类型中的对象的示例:

declare
  l_task_rec tas_tab;
  p_location_id number;//Assuming number
begin
  --Example data
  l_task_rec:=tas_tab( l_task_type_rec (10, sysdate), l_task_type_rec (21, sysdate), l_task_type_rec (35, sysdate));--This should come from somewhere else

  for counter in l_task_rec.first .. l_task_rec.last
  loop
    --You can get the data like this
    DBMS_OUTPUT.PUT_LINE('TASK_ID: '||l_task_rec(counter).TASK_ID);
    DBMS_OUTPUT.PUT_LINE('CREATION_DATE: '||l_task_rec(counter).CREATION_DATE);

    select location_id into p_location_id from csf_ct_tasks where task_id = l_task_rec(counter).TASK_ID;
   --More code
   --OPEN  ...
   --CLOSE ...
  end loop;
end;

为了使它起作用,我更改了l_task_type_rec创建类型的方式:

create TYPE l_task_type_rec is object (task_id number, creation_date date)
于 2013-09-09T18:38:41.463 回答