Oracle
 sql >> Base de données >  >> RDS >> Oracle

ERREUR :Référencez le compteur en tant que cible d'une affectation - PL/SQL

Modifier les réponses précédentes pour vous donner le triangle de Pascal, que vous avez mentionné avoir tenté dans un commentaire :

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.

Vos deux dbms_output.put_line les appels devaient être simplement dbms_output.put , car cela imprimait chaque * sur une ligne à part entière. Mais vous avez besoin d'un saut de ligne après chaque fois autour du a boucle, j'ai donc ajouté un dbms_output.newline à la fin de ça. Vous décrémentiez également temp à l'intérieur du b boucle, ce qui signifiait qu'elle était nulle au lieu de (n-1) pour la deuxième fois autour du a boucle; mais vous n'avez pas vraiment besoin d'un temp séparé variable du tout car c'est toujours la même chose que (n-a)+1 et le +1 met juste un espace supplémentaire sur chaque ligne. (J'ai aussi fait le a boucle 1..n car je suppose que vous voulez changer la valeur de n plus tard à un seul endroit). Avec n := 8 :

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

Mais surtout, vous devez également set serveroutput on format wrapped , sinon les espaces de début que vous générez dans le b boucle sont ignorées.

Vous pouvez également le faire en SQL brut, bien que vous deviez fournir le 5 deux fois, ou utilisez une variable de liaison ou de substitution :

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

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

Votre b et c les boucles font juste un lpad manuel vraiment.