Ändra de tidigare svaren för att faktiskt ge dig Pascals triangel, som du nämnde att du försökte i en kommentar:
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.
Både din dbms_output.put_line anrop behövde bara vara dbms_output.put , eftersom det var att skriva ut varje * på en linje för sig. Men du behöver en radbrytning efter varje gång runt a loop, så jag har lagt till en dbms_output.newline i slutet av det. Du sänkte också temp inuti b loop, vilket innebar att den var noll istället för (n-1) för andra gången runt a slinga; men du behöver egentligen ingen separat temp variabel alls eftersom det alltid är samma som (n-a)+1 och +1 lägger bara ett extra mellanslag på varje rad. (Jag gjorde också a loop 1..n eftersom jag antar att du vill ändra värdet på n senare endast på ett ställe). Med n := 8 :
*
***
*****
*******
*********
***********
*************
***************
Avgörande även om du också måste set serveroutput on format wrapped , annars de inledande blanksteg som du genererar i b slingan kasseras.
Du kan också göra detta i vanlig SQL, även om du måste ange 5 två gånger, eller använd en bindnings- eller substitutionsvariabel:
select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5
PASCAL
------------------------------
*
***
*****
*******
*********
Din b och c loops gör bara en manuell lpad verkligen.