Nie możesz usunąć z dwóch tabel w jednej instrukcji - nie ma odpowiednika usunięcia insert all
. (Chyba że masz ograniczenia, które kaskadowo usuwają, lub wyzwalacz, który robi to ręcznie). Dokumentacja
pokazuje, że twoja składnia jest nieprawidłowa, ponieważ nie ma ścieżki do określenia więcej niż jednej tabeli.
Musisz mieć dwie instrukcje usuwania, najpierw usuwając rekordy z tabeli podrzędnej:
DELETE FROM login
WHERE login.id_user_login = p_id_user;
DELETE FROM users
WHERE users.id_user = p_id_user;
możesz zmień ograniczenie klucza obcego na delete cascade
:
alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;
... co oznaczałoby, że musiałbyś tylko jawnie usunąć z users
stół; ale może to nie być to, czego chcesz, ponieważ usuwa jeden poziom walidacji — możesz chcieć zapobiec przypadkowemu usunięciu klucza nadrzędnego, jeśli ma on dzieci. Wydanie dwóch usunięć tak naprawdę nie boli.
Nawiasem mówiąc, twoja pierwsza procedura nie zobowiązuje, czego możesz się spodziewać. W tej linii:
...
SELECT * FROM DUAL COMMIT;
... COMMIT
jest interpretowany jako alias dla DUAL
tabela, a nie oddzielne polecenie. Potrzebujesz średnika po DUAL
, a najlepiej nową linię dla COMMIT;
. Ale ogólnie uważa się to za lepsze nie zatwierdzić w procedurze i pozwolić rozmówcy najwyższego poziomu zdecydować, czy zatwierdzić, czy wycofać, aby zachować integralność danych.