Ошибка для ассоциативного массива: отсутствует параметр OUT

#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. Алекс, большое вам спасибо, я не знаю, сколько часов я потратил вчера, пытаясь выяснить, что было не так. Спасибо, что указали и на другие ошибки. Что касается метки, этот код был частью более крупной программы, которую я написал с вложенным циклом, я поставил метку, чтобы отслеживать, какой цикл где заканчивается. Я упростил устранение моей ошибки. Программа работала после того, как я исправил ошибки, на которые вы указали.