Как заполнить Varray несколько раз - PullRequest
0 голосов
/ 18 июня 2009

У меня есть скрипт, который использует один 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. Вы можете увидеть некоторые вещи, которые я пробовал в других комментариях. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 18 июня 2009

На самом деле, @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 ...

0 голосов
/ 18 июня 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 должен наложить это ограничение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...