Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ERRO:Referenciar o contador como destino de uma atribuição - PL/SQL


Modificando as respostas anteriores para realmente fornecer o triângulo de Pascal, que você mencionou que estava tentando em um comentário:
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 seu dbms_output.put_line as chamadas precisavam ser apenas dbms_output.put , pois estava imprimindo cada * em uma linha por conta própria. Mas você precisa de uma quebra de linha após cada vez em a loop, então adicionei um dbms_output.newline no final disso. Você também estava diminuindo temp dentro do b loop, o que significava que era zero em vez de (n-1) pela segunda vez no a ciclo; mas você realmente não precisa de um temp separado variável, pois é sempre igual a (n-a)+1 e o +1 apenas coloca um espaço extra em cada linha. (Eu também fiz o a loop 1..n como eu suponho que você deseja alterar o valor de n mais tarde em apenas um lugar). Com n := 8 :
       *
      ***
     *****
    *******
   *********
  ***********
 *************
***************

Crucialmente, porém, você também precisa set serveroutput on format wrapped , caso contrário, os espaços iniciais que você está gerando no b loop são descartados.

Você também pode fazer isso em SQL simples, embora precise fornecer o 5 duas vezes, ou use uma variável de ligação ou substituição:
select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal
from dual
connect by level <= 5

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

Seu b e c loops estão apenas fazendo um lpad manual verdade.