Anda tidak dapat menghapus dari dua tabel dalam satu pernyataan - tidak ada penghapusan yang setara dengan insert all
. (Kecuali Anda memiliki batasan yang mengalirkan penghapusan, atau pemicu yang melakukannya secara manual). Dokumentasi
menunjukkan bahwa sintaks Anda tidak valid, karena tidak ada jalur untuk menentukan lebih dari satu tabel.
Anda harus memiliki dua pernyataan hapus, menghapus catatan dari tabel anak terlebih dahulu:
DELETE FROM login
WHERE login.id_user_login = p_id_user;
DELETE FROM users
WHERE users.id_user = p_id_user;
Anda bisa ubah batasan kunci asing Anda menjadi delete cascade
:
alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;
... yang berarti Anda hanya perlu menghapus secara eksplisit dari users
meja; tetapi itu mungkin bukan yang Anda inginkan, karena menghapus satu tingkat validasi - Anda mungkin ingin mencegah kunci induk dihapus secara tidak sengaja jika memiliki anak. Mengeluarkan dua penghapusan tidak terlalu merugikan di sini.
Kebetulan, prosedur pertama Anda tidak melakukan, yang mungkin Anda harapkan. Di baris ini:
...
SELECT * FROM DUAL COMMIT;
... COMMIT
ditafsirkan sebagai alias untuk DUAL
tabel, bukan perintah terpisah. Anda akan membutuhkan titik koma setelah DUAL
, dan sebaiknya baris baru untuk COMMIT;
. Tapi umumnya dianggap lebih baik tidak untuk melakukan dalam prosedur, dan membiarkan pemanggil tingkat atas memutuskan apakah akan melakukan atau memutar kembali untuk menjaga integritas data.