Modyfikując poprzednie odpowiedzi, aby faktycznie uzyskać trójkąt Pascala, o którym wspomniałeś w komentarzu:
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.
Zarówno Twój dbms_output.put_line
wywołania muszą być po prostu dbms_output.put
, ponieważ to było drukowanie każdego *
na osobnej linii. Ale potrzebujesz łamania wiersza za każdym razem wokół a
pętla, więc dodałem dbms_output.newline
na końcu tego. Zmniejszałeś także temp
wewnątrz b
pętla, co oznaczało zero zamiast (n-1)
po raz drugi w okolicach a
pętla; ale tak naprawdę nie potrzebujesz oddzielnego temp
w ogóle zmienna, ponieważ jest zawsze taka sama jak (n-a)+1
i +1
po prostu zapewnia dodatkową przestrzeń na każdej linii. (Zrobiłem też a
pętla 1..n
ponieważ zakładam, że chcesz zmienić wartość n
później tylko w jednym miejscu). Z n := 8
:
*
***
*****
*******
*********
***********
*************
***************
Co najważniejsze, musisz także set serveroutput on format wrapped
, w przeciwnym razie wiodące spacje, które generujesz w b
pętle są odrzucane.
Możesz to również zrobić w zwykłym SQL, ale musisz podać 5
dwa razy lub użyj zmiennej wiążącej lub zastępującej:
select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5
PASCAL
------------------------------
*
***
*****
*******
*********
Twój b
i c
pętle po prostu wykonują ręczny lpad
naprawdę.