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