Не можете да изтриете от две таблици в един израз - няма еквивалент на изтриване на insert all
. (Освен ако нямате ограничения, които каскадно изтриват, или тригер, който прави това ръчно). Документацията
показва, че вашият синтаксис не е валиден, тъй като няма път за указване на повече от една таблица.
Ще трябва да имате два оператора за изтриване, като първо премахнете записите от дъщерната таблица:
DELETE FROM login
WHERE login.id_user_login = p_id_user;
DELETE FROM users
WHERE users.id_user = p_id_user;
Вие можете променете ограничението на външния ключ на delete cascade
:
alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;
... което би означавало, че ще трябва изрично да изтриете само от users
маса; но това всъщност може да не е това, което искате, тъй като премахва едно ниво на валидиране - може да искате да предотвратите случайно премахване на родителски ключ, ако има деца. Издаването на две изтривания тук наистина не вреди.
Между другото, първата ви процедура не е ангажираща, което може би очаквате. В този ред:
...
SELECT * FROM DUAL COMMIT;
... COMMIT
се интерпретира като псевдоним за DUAL
таблица, а не отделна команда. Ще ви трябва точка и запетая след DUAL
и за предпочитане нов ред за COMMIT;
. Но обикновено се смята, че е по-добре не да се ангажира в процедура и да позволи на извикващия от най-високо ниво да реши дали да се ангажира или да върне обратно, за да запази целостта на данните.