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

Posted

技术标签:

【中文标题】PLS-00363:表达式“i”不能用作赋值目标【英文标题】:PLS-00363: expression 'i' cannot be used as an assignment target 【发布时间】:2018-09-21 13:27:10 【问题描述】:
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'不能用作分配目标”

任何人都可以对导致此错误的原因提出一些见解吗?

谢谢。

【问题讨论】:

与错误无关,但您可以简单地执行INSERT INTO test123( empl_number ) select level from dual connect by level <= 10 而不是循环。 【参考方案1】:

您已将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;
/

【讨论】:

【参考方案2】:

简短回答:您无需声明变量即可在FOR 循环中使用它。如果你尝试,它实际上不是同一个变量,即使它具有相同的名称。

来自文档 FOR Loop index:

FOR LOOP 语句的索引被隐式声明为循环本地的PLS_INTEGER 类型的变量。循环中的语句可以读取索引的值,但不能更改它。循环外的语句不能引用索引。 FOR LOOP 语句运行后,索引未定义。

您示例中的两个'i's 是不同的变量。您可以通过在其前面加上过程名称来引用顶层。

在循环之外,默认情况下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

【讨论】:

【参考方案3】:

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

【讨论】:

我如何增加循环计数器的值? 你没有。循环变量将自动从 1 增加到 10。您想影响哪个ii NUMBER := 0 定义的那个还是FOR i IN 1..10 LOOP 定义的那个?这些是两个不同的变量

以上是关于PLS-00363:表达式“i”不能用作赋值目标的主要内容,如果未能解决你的问题,请参考以下文章

帮助解决“表达式作为分配目标”错误

在 C# 三元运算符中给出错误:只有赋值、调用、递增、递减和新对象表达式可以用作语句

shell 脚本中 空格的注意问题:= 赋值两边不能有空格,而if比较判断时 = 两边必须加空格

CS0201:只有赋值、调用、递增、递减、等待和新对象表达式可以用作语句

类型转换

不能将:not()用作父对象,以将CSS中的子对象作为目标对象