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'不能用作分配目标”
任何人都可以对导致此错误的原因有什么见解吗?
谢谢。
答案 0 :(得分:5)
您已两次将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;
/
答案 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'。