Oracle
 sql >> Database >  >> RDS >> Oracle

Creazione ed esecuzione dinamica di comandi sql in Oracle

VARCHAR2 di Oracle tratta le stringhe vuote come NULL .
Allora

if tname != '' then

è uguale a

if tname != NULL then

che restituirà NULL invece di TRUE poiché non è definito.

Puoi controllare NULL di tname IS NOT NULL .

table_name è obbligatorio in user_tables tuttavia, quindi non è necessario questo controllo.

Altre due cose:

  1. Cerca %NOTFOUND subito dopo il recupero
  2. Utilizza i riferimenti alle colonne per le dichiarazioni delle variabili, se possibile ( user_tables.table_name%TYPE )

Quindi il tuo codice potrebbe assomigliare a questo:

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;

Potresti anche usare un cursore implicito per una migliore leggibilità:

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