Oracle
 sql >> Datenbank >  >> RDS >> Oracle

FEHLER:Verweisen Sie auf den Zähler als Ziel einer Zuweisung - PL/SQL

Ändern Sie die vorherigen Antworten, um Ihnen tatsächlich das Pascal-Dreieck zu geben, das Sie in einem Kommentar erwähnt haben:

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.

Sowohl Ihre dbms_output.put_line Aufrufe mussten nur dbms_output.put sein , da dies jeden * druckte auf einer eigenen Linie. Aber Sie brauchen nach jedem Mal um das a einen Zeilenumbruch Schleife, also habe ich eine dbms_output.newline hinzugefügt am ende davon. Sie haben auch temp dekrementiert innerhalb des b loop, was bedeutete, dass es null statt (n-1) war zum zweiten Mal um das a Schleife; aber Sie brauchen nicht wirklich ein separates temp Variable überhaupt, da das immer dasselbe ist wie (n-a)+1 und das +1 fügt nur ein zusätzliches Leerzeichen in jede Zeile ein. (Ich habe auch den a gemacht loop 1..n da ich annehme, dass Sie den Wert von n ändern möchten später nur an einer Stelle). Mit n := 8 :

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

Entscheidend ist jedoch, dass Sie auch set serveroutput on format wrapped müssen , andernfalls die führenden Leerzeichen, die Sie im b generieren Schleife werden verworfen.

Sie können dies auch in einfachem SQL tun, obwohl Sie den 5 angeben müssen zweimal, oder verwenden Sie eine Bindungs- oder Substitutionsvariable:

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

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

Ihr b und c Schleifen machen nur ein manuelles lpad wirklich.