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.