Bạn không thể xóa từ hai bảng trong một câu lệnh - không có cách xóa tương đương với insert all
. (Trừ khi bạn có các ràng buộc phân tầng việc xóa hoặc một trình kích hoạt thực hiện điều đó theo cách thủ công). Tài liệu
cho thấy rằng cú pháp của bạn không hợp lệ, vì không có đường dẫn nào để chỉ định nhiều hơn một bảng.
Bạn sẽ cần có hai câu lệnh xóa, trước tiên hãy xóa các bản ghi khỏi bảng con:
DELETE FROM login
WHERE login.id_user_login = p_id_user;
DELETE FROM users
WHERE users.id_user = p_id_user;
Bạn có thể thay đổi ràng buộc khóa ngoại của bạn thành delete cascade
:
alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;
... có nghĩa là bạn sẽ chỉ phải xóa rõ ràng khỏi users
bàn; nhưng đó có thể không thực sự là những gì bạn muốn, vì nó loại bỏ một cấp độ xác thực - bạn có thể muốn ngăn khóa cha vô tình bị xóa nếu nó có khóa con. Việc ban hành hai lần xóa không thực sự có hại ở đây.
Ngẫu nhiên, thủ tục đầu tiên của bạn không cam kết, điều mà bạn có thể mong đợi. Trong dòng này:
...
SELECT * FROM DUAL COMMIT;
... COMMIT
được hiểu là bí danh cho DUAL
bảng, không phải là một lệnh riêng biệt. Bạn sẽ cần dấu chấm phẩy sau DUAL
và tốt nhất là một dòng mới cho COMMIT;
. Nhưng nó thường được coi là tốt hơn không cam kết trong một thủ tục và cho phép người gọi cấp cao nhất quyết định cam kết hay quay lại để bảo toàn tính toàn vẹn của dữ liệu.