Запрос PLSQL для поиска по типу таблицы

Я объявил следующие типы в package.

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 не существует! Может ли кто-нибудь сказать мне, что я делаю неправильно, или указать мне правильное направление? Заранее спасибо..


person prince    schedule 09.09.2013    source источник


Ответы (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)
person Raúl Juárez    schedule 09.09.2013
comment
Привет, используя твой код, я могу повторить цикл. Но данные, которые мне нужно выбрать или распечатать, находятся внутри вложенной таблицы l_task_rec. В настоящее время я использую следующий запрос, который возвращает ошибку ORA-21700: объект не существует или помечен для удаления. Выберите task_id в l_task_id из таблицы (l_task_rec), где rownum = counter; - person prince; 10.09.2013
comment
Получение данных во вложенной таблице l_task_rec объясняется в ответе: DBMS_OUTPUT.PUT_LINE('TASK_ID: '||l_task_rec(counter).TASK_ID);. Однако, чтобы получить эту вложенную таблицу из записи в другой таблице, вы можете получить ее, как и любой другой столбец SELECT task_rec into l_task_rec from the_table where id=X - person Raúl Juárez; 10.09.2013