Úprava předchozích odpovědí tak, aby vám ve skutečnosti poskytly Pascalův trojúhelník, o kterém jste se zmínili v komentáři:
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.
Oba vaše dbms_output.put_line volání musí být pouze dbms_output.put , protože to tisklo každý * na samostatné lince. Ale potřebujete zalomení řádku za každým kolem a smyčku, takže jsem přidal dbms_output.newline na konci toho. Také jste snižovali temp uvnitř b smyčka, což znamenalo, že byla nula místo (n-1) podruhé kolem a smyčka; ale ve skutečnosti nepotřebujete samostatnou temp proměnná vůbec, protože je vždy stejná jako (n-a)+1 a +1 jen vloží místo navíc na každý řádek. (Vytvořil jsem také a smyčka 1..n předpokládám, že chcete změnit hodnotu n později pouze na jednom místě). S n := 8 :
*
***
*****
*******
*********
***********
*************
***************
Důležité je ale také set serveroutput on format wrapped , jinak úvodní mezery, které generujete v b smyčky jsou zahozeny.
Můžete to udělat také v prostém SQL, i když musíte zadat 5 dvakrát nebo použijte proměnnou vazby nebo substituce:
select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5
PASCAL
------------------------------
*
***
*****
*******
*********
Vaše b a c smyčky pouze provádějí ruční lpad opravdu.