sql >> Base de Datos >  >> RDS >> Oracle

Creación y ejecución dinámica de comandos SQL en Oracle

VARCHAR2 de Oracle trata cadenas vacías como NULL .
Entonces

if tname != '' then

es lo mismo que

if tname != NULL then

que devolverá NULL en lugar de TRUE ya que no está definido.

Puede buscar NULL por tname IS NOT NULL .

table_name es obligatorio en user_tables sin embargo, no hay necesidad de esta verificación.

Dos cosas más:

  1. Busca %NOTFOUND inmediatamente después de buscar
  2. Utilice referencias de columna para declaraciones de variables si es posible ( user_tables.table_name%TYPE )

Entonces su código podría verse así:

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;

También podría usar un cursor implícito para una mejor legibilidad:

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