sql >> Base de Datos >  >> RDS >> Oracle

ERROR:Hacer referencia al contador como destino de una asignación - PL/SQL

Modificando las respuestas anteriores para darte el triángulo de Pascal, que mencionaste que estabas intentando en un comentario:

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.

Tanto su dbms_output.put_line las llamadas debían ser solo dbms_output.put , ya que estaba imprimiendo cada * en una línea por su cuenta. Pero sí necesita un salto de línea después de cada vez alrededor del a bucle, por lo que agregué un dbms_output.newline al final de eso. También estabas disminuyendo temp dentro de la b bucle, lo que significaba que era cero en lugar de (n-1) por segunda vez alrededor del a círculo; pero realmente no necesitas un temp separado variable en absoluto, ya que siempre es lo mismo que (n-a)+1 y el +1 simplemente pone un espacio extra en cada línea. (También hice el a bucle 1..n como asumo que desea cambiar el valor de n después en un solo lugar). Con n := 8 :

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

Sin embargo, es crucial que también tenga que set serveroutput on format wrapped , de lo contrario, los espacios iniciales que está generando en el b bucle se descartan.

También puede hacer esto en SQL simple, aunque debe proporcionar el 5 dos veces, o use una variable de vinculación o sustitución:

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

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

Tu b y c los bucles solo están haciendo un lpad manual de verdad.