Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-00933:comando SQL non terminato correttamente durante l'eliminazione di due tabelle contemporaneamente

Non puoi eliminare da due tabelle in un'unica istruzione:non esiste un equivalente di eliminazione di insert all . (A meno che tu non abbia vincoli che sovrappongono l'eliminazione o un trigger che lo faccia manualmente). La documentazione mostra che la tua sintassi non è valida, poiché non esiste un percorso per specificare più di una tabella.

Dovrai avere due istruzioni di eliminazione, rimuovendo prima i record dalla tabella figlio:

  DELETE FROM login 
  WHERE login.id_user_login = p_id_user;
  DELETE FROM users
  WHERE users.id_user = p_id_user;

Potresti cambia il tuo vincolo di chiave esterna in delete cascade :

alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;

... il che significherebbe che dovresti solo eliminare esplicitamente dagli users tavolo; ma potrebbe non essere effettivamente quello che vuoi, poiché rimuove un livello di convalida:potresti voler impedire che una chiave genitore venga rimossa accidentalmente se ha figli. L'emissione di due eliminazioni non fa davvero male qui.

Per inciso, la tua prima procedura non è il commit, cosa che potresti aspettarti. In questa riga:

    ...
    SELECT * FROM DUAL COMMIT;

... il COMMIT viene interpretato come un alias per DUAL tabella, non un comando separato. Avresti bisogno di un punto e virgola dopo DUAL , e preferibilmente una nuova riga per COMMIT; . Ma generalmente è considerato meglio non eseguire il commit in una procedura e lasciare che il chiamante di livello superiore decida se eseguire il commit o il rollback per preservare l'integrità dei dati.