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
声明为变量两次。第一个作为局部变量,第二个在循环中,它会隐藏局部变量。
你试图给循环变量赋值——这是不允许的(你不需要增加循环变量;这会自动发生)
此外,您不应包含 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
定义的那个?这些是两个不同的变量。以上是关于PLS-00363:表达式“i”不能用作赋值目标的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 三元运算符中给出错误:只有赋值、调用、递增、递减和新对象表达式可以用作语句
shell 脚本中 空格的注意问题:= 赋值两边不能有空格,而if比较判断时 = 两边必须加空格