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

ORA-00933 :La commande SQL ne s'est pas correctement terminée lors de la suppression de deux tables en même temps

Vous ne pouvez pas supprimer de deux tables dans une seule instruction - il n'y a pas d'équivalent de suppression de insert all . (Sauf si vous avez des contraintes qui cascadent la suppression, ou un déclencheur qui le fait manuellement). La documentation indique que votre syntaxe n'est pas valide, car il n'y a pas de chemin pour spécifier plus d'une table.

Vous aurez besoin de deux instructions de suppression, en supprimant d'abord les enregistrements de la table enfant :

  DELETE FROM login 
  WHERE login.id_user_login = p_id_user;
  DELETE FROM users
  WHERE users.id_user = p_id_user;

Vous pourriez changez votre contrainte de clé étrangère en delete cascade :

alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;

... ce qui signifierait que vous n'auriez qu'à supprimer explicitement des users table; mais ce n'est peut-être pas ce que vous voulez, car cela supprime un niveau de validation - vous pouvez empêcher la suppression accidentelle d'une clé parent si elle a des enfants. Émettre deux suppressions ne fait pas vraiment de mal ici.

Incidemment, votre première procédure ne s'engage pas, ce à quoi vous vous attendez peut-être. Dans cette ligne :

    ...
    SELECT * FROM DUAL COMMIT;

... le COMMIT est interprété comme un alias pour le DUAL table, pas une commande séparée. Vous auriez besoin d'un point-virgule après DUAL , et de préférence une nouvelle ligne pour le COMMIT; . Mais c'est généralement considéré comme mieux pas à valider dans une procédure, et laisser l'appelant de niveau supérieur décider de valider ou de revenir en arrière pour préserver l'intégrité des données.