PL / SQL - 变量"必须是类型"编译错误

时间:2014-07-19 03:22:40

标签: sql variables compiler-errors oracle-sqldeveloper


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 的引用,但它真的不清楚问题是什么......

1 个答案:

答案 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.