在 Oracle SQL Developer 中,我声明了一个INT
变量,在WHILE
循环中迭代它,打印变量的值是正还是负,并递增循环中的值如下:
SET DEFINE OFF -- required to prevent the "Enter Substitution Variable" dialog
DECLARE myNumber INT := 0; -- looks like Ada, or Algol 68 assignment...
SET myNumber := 1; -- ...why is SET required here?
BEGIN
WHILE myNumber < 10 LOOP
IF REMAINDER(myNumber, 2) = 0 THEN -- no remainder operator in PL/SQL?
-- string concatenation is done with ||
DBMS_OUTPUT.PUT_LINE('even number: ' || myNumber || '.\n');
ELSE
DBMS_OUTPUT.PUT_LINE('odd number: ' || myNumber || '.\n');
END IF;
myNumber := myNumber + 1; -- SET is not allowed here?
END LOOP;
END;
...但它没有工作,并且在变量的声明上抛出了编译错误:
Error report -
ORA-06550: line 2, column 5:
PLS-00488: 'MYNUMBER' must be a type
ORA-06550: line 2, column 5:
PL/SQL: Item ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
我找到了错误PLS-00488 here 的引用,但它真的不清楚问题是什么......
答案 0 :(得分:1)
在PL / SQL中,您不能使用SET
运算符进行分配。您非常非常少地使用它来执行诸如在PL / SQL块中设置事务隔离级别之类的操作。如果你只是学习PL / SQL,你可以安全地忽略SET
几年的存在。
除了作为变量声明的一部分之外,您不能为块的DECLARE
部分中的局部变量赋值。如果要将myNumber
初始化为1,则需要在初始化部分中指定1而不是0。如果要在初始化后设置变量的值,则需要在块的主体中执行该操作,而不是在声明中。
你几乎肯定不想要&#34; \ n&#34;在dbms_output.put_line
来电中。 dbms_output.put_line
隐式包含新行字符。并且&#34; \ n&#34;不被解释为新行,它只是被解释为两个字符&#34; \&#34;和&#34; n&#34;所以它打印文字&#34; \ n&#34;在每一行的末尾。
如果你想从0开始,你可能想要像
这样的东西SQL> ed
Wrote file afiedt.buf
1 DECLARE
2 myNumber INT := 0; -- looks like Ada, or Algol 68 assignment...
3 BEGIN
4 WHILE myNumber < 10 LOOP
5 IF REMAINDER(myNumber, 2) = 0 THEN -- no remainder operator in PL/SQL?
6 -- string concatenation is done with ||
7 DBMS_OUTPUT.PUT_LINE('even number: ' || myNumber || '.');
8 ELSE
9 DBMS_OUTPUT.PUT_LINE('odd number: ' || myNumber || '.');
10 END IF;
11 myNumber := myNumber + 1; -- SET is not allowed here?
12 END LOOP;
13* END;
SQL> /
even number: 0.
odd number: 1.
even number: 2.
odd number: 3.
even number: 4.
odd number: 5.
even number: 6.
odd number: 7.
even number: 8.
odd number: 9.
PL/SQL procedure successfully completed.
如果您想在开始循环之前指定值1,则可以在块的正文中使用:=
赋值运算符
SQL> ed
Wrote file afiedt.buf
1 DECLARE
2 myNumber INT := 0; -- looks like Ada, or Algol 68 assignment...
3 BEGIN
4 myNumber := 1;
5 WHILE myNumber < 10 LOOP
6 IF REMAINDER(myNumber, 2) = 0 THEN -- no remainder operator in PL/SQL?
7 -- string concatenation is done with ||
8 DBMS_OUTPUT.PUT_LINE('even number: ' || myNumber || '.');
9 ELSE
10 DBMS_OUTPUT.PUT_LINE('odd number: ' || myNumber || '.');
11 END IF;
12 myNumber := myNumber + 1; -- SET is not allowed here?
13 END LOOP;
14* END;
SQL> /
odd number: 1.
even number: 2.
odd number: 3.
even number: 4.
odd number: 5.
even number: 6.
odd number: 7.
even number: 8.
odd number: 9.
PL/SQL procedure successfully completed.