sql >> Databáze >  >> RDS >> Oracle

CHYBA:Odkazujte na čítač jako na cíl přiřazení - PL/SQL

Úprava předchozích odpovědí tak, aby vám ve skutečnosti poskytly Pascalův trojúhelník, o kterém jste se zmínili v komentáři:

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.

Oba vaše dbms_output.put_line volání musí být pouze dbms_output.put , protože to tisklo každý * na samostatné lince. Ale potřebujete zalomení řádku za každým kolem a smyčku, takže jsem přidal dbms_output.newline na konci toho. Také jste snižovali temp uvnitř b smyčka, což znamenalo, že byla nula místo (n-1) podruhé kolem a smyčka; ale ve skutečnosti nepotřebujete samostatnou temp proměnná vůbec, protože je vždy stejná jako (n-a)+1 a +1 jen vloží místo navíc na každý řádek. (Vytvořil jsem také a smyčka 1..n předpokládám, že chcete změnit hodnotu n později pouze na jednom místě). S n := 8 :

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

Důležité je ale také set serveroutput on format wrapped , jinak úvodní mezery, které generujete v b smyčky jsou zahozeny.

Můžete to udělat také v prostém SQL, i když musíte zadat 5 dvakrát nebo použijte proměnnou vazby nebo substituce:

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

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

Vaše b a c smyčky pouze provádějí ruční lpad opravdu.



  1. Jak přidat sloupec tabulky MySQL s výchozí hodnotou jiného sloupce stávajícího řádku

  2. Codeigniter simple_query vs. tvůrce dotazů (vložení, aktualizace a odstranění)

  3. Jak mohu použít alias v klauzuli where?

  4. PostgreSQL:Vyberte data s lajkem v poli časového razítka