Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORA-00933:comando SQL não finalizado corretamente ao excluir duas tabelas ao mesmo tempo


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.