Как заполнить varray несколько раз

У меня есть скрипт, который использует один VARRAY несколько раз. Но я не могу понять, как сбросить VARRAY после того, как прокрутил его один раз. Я написал следующий базовый скрипт, чтобы помочь мне устранить неполадки:

DECLARE
   TYPE multi_show_id_type IS VARRAY (60) OF VARCHAR2 (10);

   multi_show_id multi_show_id_type := multi_show_id_type ();
   counter       NUMBER := 1;
   i             NUMBER := 1;
BEGIN
   DBMS_OUTPUT.put_line ('BEGIN');

   WHILE i < 10
   LOOP
      DBMS_OUTPUT.put_line (i);
      --counter:=0;
      --multi_show_id :=multi_show_id_type();
      --multi_show_id.delete;

      WHILE counter < 25
      LOOP
         multi_show_id.EXTEND ();
         multi_show_id (counter) := counter * counter;
         DBMS_OUTPUT.put_line ('VArray: [' || counter || '] [' || multi_show_id (counter) || ']');

         counter := counter + 1;
      END LOOP;
      i := i + 1;
   END LOOP;

   DBMS_OUTPUT.put_line ('END');
END;
/

Этот скрипт работает, когда он проходит через массив только один раз. Но если вы раскомментируете строку counter:=0, что заставит ее пройти через цикл заполнения массива 10 раз, я получу ошибку ORA-06532. Вы можете увидеть кое-что из того, что я пробовал, в других строках комментариев. Любая помощь будет оценена по достоинству.


person Community    schedule 18.06.2009    source источник


Ответы (2)


На самом деле, @akf верен; ваш код, как написано, не будет работать, потому что VARRAY начинается с элемента 1, а не с нуля.

Измените свой код таким образом, и он работает:

   ...
   LOOP
          DBMS_OUTPUT.put_line (i);
          counter:=1;
          --multi_show_id :=multi_show_id_type();
          multi_show_id.delete;

          WHILE counter < 26
          LOOP
            ...

РЕДАКТИРОВАТЬ: если вы хотите запустить цикл 25 раз, вам нужно изменить верхнюю границу цикла WHILE на 26...

person DCookie    schedule 18.06.2009
comment
Тогда он столкнется с другой проблемой. Когда он пытается РАСШИРИТЬСЯ за пределы 60. - person David; 18.06.2009
comment
Нет, он не будет. varray очищается при каждом проходе через i-й цикл. Попробуй это. - person DCookie; 18.06.2009
comment
ах да, я вижу, вы тоже добавили DELETE. - person David; 18.06.2009

здесь, кажется, есть две проблемы. во-первых, индекс VARRAY начинается с 1. во-вторых, вы остановитесь, когда ваш VARRAY заполнится до 60 элементов, как определено в вашем объявлении.

используйте следующее:

TYPE multi_show_id_type IS VARRAY (250) OF VARCHAR2 (10);

и

counter:=1;

раскомментируйте строку multi_show_id :=multi_show_id_type();, если вы хотите начинать с 1 для каждого цикла. если вы хотите убедиться, что не более 4 значений, ваш внутренний цикл while должен сделать это ограничение.

person akf    schedule 18.06.2009
comment
Как это решает мою проблему? Я хочу, чтобы varray перезапускался с 1 в каждом цикле. Для моей реальной программы в массиве будет храниться не более 4 значений, а обычно только одно. - person ; 18.06.2009