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.