Oracle
 sql >> Database >  >> RDS >> Oracle

ERRORE:fare riferimento al contatore come destinazione di un'assegnazione - PL/SQL

Modificando le risposte precedenti per darti effettivamente il triangolo di Pascal, che hai menzionato che stavi tentando in un commento:

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.

Sia il tuo dbms_output.put_line le chiamate dovevano essere solo dbms_output.put , poiché stava stampando ogni * su una linea da solo. Ma hai bisogno di un'interruzione di riga dopo ogni volta intorno a a loop, quindi ho aggiunto un dbms_output.newline alla fine. Stavi anche diminuendo temp all'interno del b loop, il che significava che era zero invece di (n-1) per la seconda volta intorno al a ciclo continuo; ma non hai davvero bisogno di un temp separato in quanto è sempre la stessa di (n-a)+1 e il +1 mette solo uno spazio in più su ogni riga. (Ho anche creato il a ciclo 1..n come presumo tu voglia cambiare il valore di n successivamente in un solo luogo). Con n := 8 :

       *
      ***
     *****
    *******
   *********
  ***********
 *************
***************

Fondamentalmente però devi anche set serveroutput on format wrapped , altrimenti gli spazi iniziali che stai generando nel b loop vengono scartati.

Puoi anche farlo in semplice SQL, anche se devi fornire il 5 due volte, oppure usa una variabile di associazione o di sostituzione:

select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5

PASCAL
------------------------------
    *
   ***
  *****
 *******
*********

Il tuo b e c i loop stanno solo facendo un lpad manuale davvero.