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

ORA-00933:SQL-kommando blev ikke afsluttet korrekt ved sletning af to tabeller på samme tid

Du kan ikke slette fra to tabeller i én sætning - der er ingen delete-ækvivalent til insert all . (Medmindre du har begrænsninger, der kaskaderer sletningen, eller en trigger, der gør det manuelt). Dokumentationen viser, at din syntaks ikke er gyldig, da der ikke er nogen sti til at angive mere end én tabel.

Du skal have to delete-sætninger, og du skal først fjerne posterne fra den underordnede tabel:

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

Du kunne ændre din fremmednøgle begrænsning til delete cascade :

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

... hvilket ville betyde, at du kun skal slette fra users bord; men det er måske faktisk ikke det, du ønsker, da det fjerner ét niveau af validering - du vil måske forhindre, at en forældrenøgle ved et uheld bliver fjernet, hvis den har børn. At udstede to sletninger gør ikke rigtig ondt her.

I øvrigt er din første procedure ikke forpligtende, hvilket du måske forventer. I denne linje:

    ...
    SELECT * FROM DUAL COMMIT;

... COMMIT tolkes som et alias for DUAL tabel, ikke en separat kommando. Du skal bruge et semikolon efter DUAL , og helst en ny linje til COMMIT; . Men det anses generelt for at være bedre ikke at forpligte sig i en procedure, og lade den, der ringer på øverste niveau, beslutte, om han vil forpligte sig eller rulle tilbage for at bevare dataintegriteten.




  1. Tæl, hvor kolonnen ændres til specifik værdi i postgres

  2. NLSSORT() Funktion i Oracle

  3. Flere muligheder for LINES TERMINATED BY og FIELDS TERMINATED BY - MySQL

  4. Vælg mySQL kun baseret på måned og år