Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Dynamisches Erstellen und Ausführen von SQL-Befehlen in Oracle

VARCHAR2 von Oracle behandelt leere Zeichenfolgen als NULL .
Also

if tname != '' then

ist dasselbe wie

if tname != NULL then

was NULL zurückgibt statt TRUE da es nicht definiert ist.

Sie können auf NULL prüfen von tname IS NOT NULL .

table_name ist in user_tables obligatorisch Diese Prüfung ist jedoch nicht erforderlich.

Zwei weitere Dinge:

  1. Suchen Sie nach %NOTFOUND unmittelbar nach dem Abrufen
  2. Verwenden Sie nach Möglichkeit Spaltenreferenzen für Variablendeklarationen ( user_tables.table_name%TYPE )

Ihr Code könnte also so aussehen:

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;

Zur besseren Lesbarkeit könnten Sie auch einen impliziten Cursor verwenden:

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