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