Ændring af de tidligere svar til rent faktisk at give dig Pascals trekant, som du nævnte, du forsøgte 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 dine dbms_output.put_line
opkald skulle kun være dbms_output.put
, da det var at udskrive hver *
på en linje for sig selv. Men du har brug for et linjeskift efter hver gang omkring a
loop, så jeg har tilføjet en dbms_output.newline
i slutningen af det. Du sænkede også temp
inde i b
loop, hvilket betød, at det var nul i stedet for (n-1)
for anden gang omkring a
sløjfe; men du behøver ikke rigtig en separat temp
variabel overhovedet, da det altid er det samme som (n-a)+1
og +1
sætter bare et ekstra mellemrum på hver linje. (Jeg lavede også a
loop 1..n
da jeg antager, at du vil ændre værdien af n
senere kun ét sted). Med n := 8
:
*
***
*****
*******
*********
***********
*************
***************
Det er afgørende, at du også skal set serveroutput on format wrapped
, ellers de førende mellemrum, du genererer i b
sløjfe kasseres.
Du kan også gøre dette i almindelig SQL, selvom du skal angive 5
to gange, eller brug en bindings- eller substitutionsvariabel:
select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5
PASCAL
------------------------------
*
***
*****
*******
*********
Din b
og c
loops laver bare en manuel lpad
virkelig.