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

Dynamické vytváření a provádění příkazů SQL v oracle

Oracle VARCHAR2 zachází s prázdnými řetězci jako s NULL .
Takže

if tname != '' then

je stejný jako

if tname != NULL then

což vrátí NULL místo TRUE protože to není definováno.

Můžete zkontrolovat NULL od tname IS NOT NULL .

table_name je povinný v user_tables tuto kontrolu však není potřeba.

Další dvě věci:

  1. Vyhledejte %NOTFOUND ihned po načtení
  2. Pokud je to možné, použijte pro deklarace proměnných odkazy na sloupce ( user_tables.table_name%TYPE )

Váš kód by tedy mohl vypadat takto:

DECLARE
  tname user_tables.table_name%TYPE;
  CURSOR ctable IS SELECT table_name FROM user_tables;
BEGIN
  OPEN ctable;
  LOOP
    FETCH ctable INTO tname;
    EXIT WHEN ctable%NOTFOUND;
    EXECUTE IMMEDIATE 'drop table ' || tname;
  END LOOP;
  CLOSE ctable;
END;

Pro lepší čitelnost můžete také použít implicitní kurzor:

BEGIN
  FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
    EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
  END LOOP;
END;



  1. Regex, aby odpovídal komentářům MySQL

  2. Hromadné vkládání MySQL z datových souborů CSV

  3. Sečíst sloupce s hodnotami null v oracle

  4. Funkce Postgresql s příkazem if