#arrays #oracle #collections #associative
#массивы #Oracle #Коллекции #ассоциативный
Вопрос:
Я изучаю коллекции и пробую ассоциативные массивы в Oracle 11g. Я использую SQL Developer для написания и тестирования моего кода ниже, и я получаю ошибку, которую я не могу устранить :
Error Report
Missing IN OUT Parameter at index ::1
Код, который я написал, выглядит следующим образом:
---SIMPLE collections EXAMPLE
DECLARE
TYPE prospect_towns IS TABLE OF VARCHAR2 (25)
INDEX BY PLS_INTEGER;
a_big_towns prospect_towns; -- associative array
i PLS_INTEGER := 1; -- index for the array
v_counter NUMBER;
v_town VARCHAR2(25);
BEGIN
a_big_towns(1):='Birmingham';
a_big_towns(2):='London':
a_big_towns(3):='Manchester';
-- v_counter := 1;
FOR i IN 1..a_big_towns.COUNT
LOOP <<big towns>>
--v_town := a_big_towns(i);
DBMS_OUTPUT.PUT_LINE('Inside Loop, town is '||a_big_towns(i));
i= a_big_towns.next:
END LOOP<<big towns>>
END;
/
Есть идеи, что не так?
Ответ №1:
Вторая из этих строк:
a_big_towns(1):='Birmingham';
a_big_towns(2):='London':
a_big_towns(3):='Manchester';
… имеет двоеточие в конце вместо точки с запятой. Это приводит a_big_towns
к тому, что синтаксический анализатор интерпретирует следующее как имя переменной привязки. Так и должно быть:
a_big_towns(2):='London';
Как только вы пройдете мимо этого, эта строка не понадобится и потребуется :=
вместо =
, если бы она была, а также имеет двоеточие вместо точки с запятой в конце:
i= a_big_towns.next:
… поэтому удалите это полностью.
Я не уверен, что метки действительно что-то добавляют сюда, но если у вас есть метка, ее не нужно повторять в конце, и в имени не может быть пробела, поэтому сделайте это:
<<big_towns>>
FOR i IN 1..a_big_towns.COUNT LOOP
И для этого требуется точка с запятой в конце:
END LOOP;
Эта скрипка SQL компилируется.
Комментарии:
1. Алекс, большое вам спасибо, я не знаю, сколько часов я потратил вчера, пытаясь выяснить, что было не так. Спасибо, что указали и на другие ошибки. Что касается метки, этот код был частью более крупной программы, которую я написал с вложенным циклом, я поставил метку, чтобы отслеживать, какой цикл где заканчивается. Я упростил устранение моей ошибки. Программа работала после того, как я исправил ошибки, на которые вы указали.