Oracle
 sql >> Base de données >  >> RDS >> Oracle

Créer et exécuter dynamiquement des commandes sql dans oracle

VARCHAR2 d'Oracle traite les chaînes vides comme NULL .
Alors

if tname != '' then

est le même que

if tname != NULL then

qui renverra NULL au lieu de TRUE puisqu'il n'est pas défini.

Vous pouvez vérifier NULL par tname IS NOT NULL .

table_name est obligatoire dans user_tables cependant, il n'y a donc pas besoin de cette vérification.

Deux autres choses :

  1. Vérifier %NOTFOUND immédiatement après la récupération
  2. Utilisez des références de colonne pour les déclarations de variables si possible ( user_tables.table_name%TYPE )

Donc votre code pourrait ressembler à ça :

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;

Vous pouvez également utiliser un curseur implicite pour une meilleure lisibilité :

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