Nemůžete smazat ze dvou tabulek v jednom příkazu – neexistuje žádný ekvivalent odstranění insert all
. (Pokud nemáte omezení, která mazání kaskádují, nebo spouštěč, který to dělá ručně). Dokumentace
ukazuje, že vaše syntaxe není platná, protože neexistuje žádná cesta k určení více než jedné tabulky.
Budete potřebovat dva příkazy delete, přičemž nejprve odstraníte záznamy z podřízené tabulky:
DELETE FROM login
WHERE login.id_user_login = p_id_user;
DELETE FROM users
WHERE users.id_user = p_id_user;
Mohli byste změňte omezení cizího klíče na delete cascade
:
alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;
... což by znamenalo, že byste museli pouze explicitně odstranit z users
stůl; ale to ve skutečnosti nemusí být to, co chcete, protože to odstraňuje jednu úroveň ověření - možná budete chtít zabránit náhodnému odebrání nadřazeného klíče, pokud má potomky. Vydání dvou smazání zde opravdu nebolí.
Mimochodem, váš první postup není spáchání, což byste mohli očekávat. V tomto řádku:
...
SELECT * FROM DUAL COMMIT;
... COMMIT
je interpretován jako alias pro DUAL
tabulka, nikoli samostatný příkaz. Za DUAL
byste potřebovali středník a pokud možno nový řádek pro COMMIT;
. Ale obecně se to považuje za lepší ne provést potvrzení v proceduře a nechat volajícího nejvyšší úrovně rozhodnout, zda provést potvrzení nebo vrátit zpět, aby byla zachována integrita dat.