Du kan ikke slette fra to tabeller i én sætning - der er ingen delete-ækvivalent til insert all
. (Medmindre du har begrænsninger, der kaskaderer sletningen, eller en trigger, der gør det manuelt). Dokumentationen
viser, at din syntaks ikke er gyldig, da der ikke er nogen sti til at angive mere end én tabel.
Du skal have to delete-sætninger, og du skal først fjerne posterne fra den underordnede tabel:
DELETE FROM login
WHERE login.id_user_login = p_id_user;
DELETE FROM users
WHERE users.id_user = p_id_user;
Du kunne ændre din fremmednøgle begrænsning til delete cascade
:
alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;
... hvilket ville betyde, at du kun skal slette fra users
bord; men det er måske faktisk ikke det, du ønsker, da det fjerner ét niveau af validering - du vil måske forhindre, at en forældrenøgle ved et uheld bliver fjernet, hvis den har børn. At udstede to sletninger gør ikke rigtig ondt her.
I øvrigt er din første procedure ikke forpligtende, hvilket du måske forventer. I denne linje:
...
SELECT * FROM DUAL COMMIT;
... COMMIT
tolkes som et alias for DUAL
tabel, ikke en separat kommando. Du skal bruge et semikolon efter DUAL
, og helst en ny linje til COMMIT;
. Men det anses generelt for at være bedre ikke at forpligte sig i en procedure, og lade den, der ringer på øverste niveau, beslutte, om han vil forpligte sig eller rulle tilbage for at bevare dataintegriteten.