错误:引用计数器作为赋值的目标 - PL / SQL

时间:2014-03-28 13:03:19

标签: sql oracle

我对SQL比较陌生。 我试图通过此代码打印一个简单的模式

declare
   n number(2):=5;
   temp number(2):=n;
 begin
   for a in 1..5
       a:=a+1;loop
       for b in 1..temp loop
           b:=b+1;
           dbms_output.put_line(' ');
           temp:=temp-1;
       end loop;
   for c in 1..2*a-1 loop
   c:=c+1;
   dbms_output.put_line('*');
 end loop;
end loop;
end;
/

我一直收到这个错误:

PLS-00103: Encountered the symbol "A" when expecting one of the following:
* & - + / at loop mod remainder rem <an exponent (**)> ||
multiset

我理解Oracle不允许引用计数器作为赋值的目标,这就是为什么我在第6行继续收到错误但是我甚至无法通过声明另一个全局变量来使其工作在其中分配增量声明但它也不起作用。 请帮忙。 谢谢!

3 个答案:

答案 0 :(得分:3)

修改之前的答案,实际上给你Pascal的三角形,你提到你在评论中试图:

set serveroutput on format wrapped
declare
   n number(2):=5;
begin
  for a in 1..n loop
    for b in 1..n-a loop
      dbms_output.put(' ');
    end loop;
    for c in 1..2*a-1 loop
      dbms_output.put('*');
    end loop;
    dbms_output.new_line;
  end loop;
end;
/

    *
   ***
  *****
 *******
*********

PL/SQL procedure successfully completed.

您的dbms_output.put_line来电必须只是dbms_output.put,因为这样就会在每条线路上打印*。但是每次在a循环后都需要换行,所以我在最后添加了dbms_output.newline。您还在temp循环内递减b,这意味着它在(n-1)循环周围第二次为零而不是a;但是你根本不需要一个单独的temp变量,因为它始终与(n-a)+1相同,而+1只是在每一行上放置一个额外的空格。 (我还设置了a循环1..n,因为我假设你想稍后在一个地方更改n的值。使用n := 8

       *
      ***
     *****
    *******
   *********
  ***********
 *************
***************

至关重要的是,您还必须set serveroutput on format wrapped,否则您在b循环中生成的前导空格将被丢弃。

您也可以在纯SQL中执行此操作,但需要提供5两次,或使用绑定或替换变量:

select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5

PASCAL
------------------------------
    *
   ***
  *****
 *******
*********

您的bc循环真的只是手动lpad

答案 1 :(得分:1)

当我在编辑器中使用您的代码时,我首先注意到,您在启动循环之前尝试增加a,并且Oracle在此时给出了第一个错误。并且它也不允许你在for循环中增加计数器变量,(我不知道为什么)我在互联网上检查并发现你不能为Oracle for循环设置增量步骤也你不能设置一个值对于for循环中的计数器变量。

以下代码适用于我:

declare
   n number(2):=5;
   temp number(2):=n;
 begin
   for a in 1..5
   loop    --a:=a+1;
       for b in 1..temp loop
           --b:=b+1;
           dbms_output.put_line(' ');
           temp:=temp-1;
       end loop;
   for c in 1..2*a-1 loop
   --c:=c+1;
   dbms_output.put_line('*');
 end loop;
end loop;
end;
/

答案 2 :(得分:1)

正如StephaneM所说,循环变量由循环本身递增:你不需要做a := a + 1,最重要的是你可以分配它们!这是一个更正版本:

declare
   n number(2):=5;
   temp number(2):=n;
begin
  for a in 1..5
  loop
    for b in 1..temp loop
      dbms_output.put_line(' ');
      temp:=temp-1;
    end loop;
    for c in 1..2*a-1 loop
      dbms_output.put_line('*');
    end loop;
  end loop;
end;
/