Как добавлять элементы списка записей при повторении списка записей?

#sql #oracle #plsql

Вопрос:

 DECLARE
TYPE visit AS RECORD
(
  DATA_1 VARCHAR2;
)
TYPE lstVisit IS TABLE OF visit;
BEGIN
 FOR I IN LISTA.FIRST..LISTA.LAST LOOP
  FOR J IN LISTB.FIRST..LISTB.LAST LOOP
    lstfetchdata:=function_fetchdata(LISTA); 
  END LOOP;
   lstVisit:= lstfetchdata;
 END LOOP;
 

Теперь проблема, с которой я сталкиваюсь, заключается в том, как сохранить все элементы в lstVisit.
Предположим, функция fetchdata() возвращает 3 строки, а в последующем вызове возвращает 2 и так далее.
Как я должен индексировать lstVisit, чтобы хранить все значения одно за другим

Комментарии:

1. Ваш псевдокод немного неясен; что такое LISTA и LISTB, и что LISTB добавляет в пример — или функция должна принимать текущий элемент обоих из них, а не весь СПИСОК? Как определяются переменные lstVisit и lstfetchdata , имеют ли они оба lstVisit типа (что в лучшем случае приводит к путанице в именовании)?

2. @Alexpool СПИСОК и СПИСОК B-это два похожих типа записей списка

Ответ №1:

Для каждой записи, возвращаемой вызовом функции, вы можете расширить свою окончательную lstVisit коллекцию и назначить извлеченную запись в эту позицию; что-то вроде:

   -- initialise the final collection
  lstVisit := new tabVisit();

  -- loop over both existing collections
  for i in lista.first..lista.last loop
    for j in listb.first..listb.last loop
      -- get a subset of values
      lstfetchdata:=function_fetchdata(lista(i), listb(j));
      -- loop around that subset
      for k in 1..lstfetchdata.count loop
        -- extend the final collection and add the subset value
        lstVisit.extend();
        lstVisit(lstVisit.count) := lstfetchdata(k);
      end loop;
    end loop;
  end loop;
 

db<>fiddle<> с некоторыми изменениями имени и функцией создания случайных строк на основе значений lista/b, но это должно дать вам представление.