PLS-00363: выражение «i» нельзя использовать в качестве цели назначения - PullRequest
0 голосов
/ 21 сентября 2018
CREATE or replace stored procedure test123 as
DECLARE
    i   NUMBER := 0;
BEGIN
    FOR i IN 1..10 LOOP
        INSERT INTO test123 ( empl_number ) VALUES ( i );
        i := i + 1;
    END LOOP;
END;

я пытаюсь создать эту хранимую процедуру и получаю следующую ошибку: «выражение« I »не может быть использовано в качестве цели назначения»

Может кто-нибудь подсказать, что может бытьпричина этой ошибки?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Вы объявили i как переменную дважды.Сначала в качестве локальной переменной, а затем в цикле, которая скрывает локальную переменную.

Вы пытаетесь присвоить значение переменной цикла, что недопустимо (вам не нужно увеличивать переменную цикла;это произойдет автоматически)

Кроме того, вы не должны включать слова STORED или DECLARE, так как они имеют недопустимый синтаксис.

Таким образом, вы можете просто написать это как:

CREATE or replace procedure test123 as
BEGIN
    FOR i IN 1..10 LOOP
        INSERT INTO table_name ( empl_number ) VALUES ( i );
    END LOOP;
END;
/
0 голосов
/ 22 сентября 2018

Краткий ответ: вам не нужно объявлять переменную, чтобы использовать ее в цикле FOR.Если вы попытаетесь, это на самом деле не та же самая переменная, даже если она имеет то же имя.

Из документации для FOR Loop index :

Индекс оператора FOR LOOP неявно объявляется как переменная типа PLS_INTEGER, которая является локальной для цикла.Операторы в цикле могут прочитать значение индекса, но не могут его изменить.Заявления вне цикла не могут ссылаться на индекс.После выполнения оператора FOR LOOP индекс не определен.

Два 'i' в вашем примере - это разные переменные.Вы можете обратиться к первому уровню, добавив к нему префикс имени процедуры.

Вне цикла по умолчанию i относится к переменной уровня процедуры.В цикле i относится к индексу цикла.

create or replace procedure test123 as
    i  number := 0;
begin
    for i in 1..5 loop
        test123.i := test123.i + 10;

        dbms_output.put_line('Loop index i = ' || i);
        dbms_output.put_line('Procedure-level variable i = ' || test123.i);
    end loop;

    dbms_output.put_line('After loop: i = ' || i);
end;

Вывод:

Loop index i = 1
Procedure-level variable i = 10
Loop index i = 2
Procedure-level variable i = 20
Loop index i = 3
Procedure-level variable i = 30
Loop index i = 4
Procedure-level variable i = 40
Loop index i = 5
Procedure-level variable i = 50
After loop: i = 50
0 голосов
/ 21 сентября 2018

В коде, показанном выше, переменная управления циклом i не присваивается, и в цикле она «скрывает» объявленную переменную «i».

...