Você não pode excluir de duas tabelas em uma instrução - não há equivalente de exclusão de
insert all
. (A menos que você tenha restrições que cascateem a exclusão ou um gatilho que faça isso manualmente). A documentação
mostra que sua sintaxe não é válida, pois não há caminho para especificar mais de uma tabela. Você precisará ter duas instruções delete, removendo os registros da tabela filho primeiro:
DELETE FROM login
WHERE login.id_user_login = p_id_user;
DELETE FROM users
WHERE users.id_user = p_id_user;
Você poderia altere sua restrição de chave estrangeira para
delete cascade
:alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;
... o que significaria que você só teria que excluir explicitamente dos
users
tabela; mas isso pode não ser realmente o que você deseja, pois remove um nível de validação - você pode impedir que uma chave pai seja removida acidentalmente se tiver filhos. Emitir duas exclusões não faz mal aqui. Aliás, seu primeiro procedimento não está cometendo, o que você pode estar esperando. Nesta linha:
...
SELECT * FROM DUAL COMMIT;
... o
COMMIT
é interpretado como um alias para o DUAL
tabela, não um comando separado. Você precisaria de um ponto e vírgula após DUAL
, e de preferência uma nova linha para o COMMIT;
. Mas geralmente é considerado melhor não para confirmar em um procedimento e deixar o chamador de nível superior decidir se deve confirmar ou reverter para preservar a integridade dos dados.