U kunt niet uit twee tabellen in één instructie verwijderen - er is geen verwijderequivalent van insert all
. (Tenzij u beperkingen hebt die het verwijderen trapsgewijs uitvoeren, of een trigger die dat handmatig doet). De documentatie
geeft aan dat uw syntaxis niet geldig is, omdat er geen pad is om meer dan één tabel op te geven.
U heeft twee verwijderinstructies nodig, waarbij u eerst de records uit de onderliggende tabel verwijdert:
DELETE FROM login
WHERE login.id_user_login = p_id_user;
DELETE FROM users
WHERE users.id_user = p_id_user;
Je zou verander uw externe sleutelbeperking in delete cascade
:
alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;
... wat zou betekenen dat u alleen expliciet hoeft te verwijderen van de users
tafel; maar dat is misschien niet echt wat je wilt, omdat het één niveau van validatie verwijdert - je wilt misschien voorkomen dat een bovenliggende sleutel per ongeluk wordt verwijderd als deze kinderen heeft. Twee keer verwijderen kan hier geen kwaad.
Overigens is je eerste ingreep niet vrijblijvend, wat je misschien wel zou verwachten. In deze regel:
...
SELECT * FROM DUAL COMMIT;
... de COMMIT
wordt geïnterpreteerd als een alias voor de DUAL
tabel, geen afzonderlijk commando. Je hebt een puntkomma nodig na DUAL
, en bij voorkeur een nieuwe regel voor de COMMIT;
. Maar het wordt over het algemeen als beter beschouwd niet vast te leggen in een procedure en laat de beller op het hoogste niveau beslissen of hij zich vastlegt of terugdraait om de gegevensintegriteit te behouden.