Ä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.