PLS-00363:表达式“ i”不能用作分配目标

时间:2018-09-21 13:27:11

标签: oracle stored-procedures plsql

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 :(得分:5)

您已两次将i声明为变量。首先是局部变量,其次是循环变量,这遮盖了局部变量。

您正在尝试为循环变量分配一个值-这是不允许的(您无需增加循环变量;这将自动发生)

此外,您不应包含STOREDDECLARE单词,因为它们是无效的语法。

所以您可以简单地将其写为:

CREATE or replace procedure test123 as
BEGIN
    FOR i IN 1..10 LOOP
        INSERT INTO table_name ( empl_number ) VALUES ( i );
    END LOOP;
END;
/

答案 1 :(得分:2)

简短的回答:您无需声明变量即可在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

答案 2 :(得分:0)

在上面显示的代码中,循环控制变量i是不可分配的,并且在循环内它“隐藏”声明的变量'i'。