【问题标题】:PLS-00363: expression 'i' cannot be used as an assignment targetPLS-00363:表达式“i”不能用作赋值目标
【发布时间】: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 而不是循环。

标签: oracle stored-procedures plsql


【解决方案1】:

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

【讨论】:

    【解决方案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。您想影响哪个i,i NUMBER := 0 定义的那个还是FOR i IN 1..10 LOOP 定义的那个?这些是两个不同的变量。
      猜你喜欢
      • 2012-04-16
      • 2014-04-11
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多