sql >> Databasteknik >  >> RDS >> Oracle

ORA-00933:SQL-kommandot avslutades inte korrekt när två tabeller raderades samtidigt

Du kan inte ta bort från två tabeller i en sats - det finns ingen raderingsmotsvarighet till insert all . (Om du inte har begränsningar som kaskader raderingen, eller en utlösare som gör det manuellt). Dokumentationen visar att din syntax inte är giltig, eftersom det inte finns någon sökväg för att ange mer än en tabell.

Du måste ha två delete-satser, ta bort posterna från den underordnade tabellen först:

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

Du kunde ändra din främmande nyckel till delete cascade :

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

... vilket skulle innebära att du bara skulle behöva ta bort från users tabell; men det kanske inte är vad du vill, eftersom det tar bort en nivå av validering - du kanske vill förhindra att en föräldranyckel av misstag tas bort om den har barn. Att utfärda två raderingar skadar inte riktigt här.

Förresten, din första procedur är inte bindande, vilket du kanske förväntar dig. På den här raden:

    ...
    SELECT * FROM DUAL COMMIT;

... COMMIT tolkas som ett alias för DUAL tabell, inte ett separat kommando. Du skulle behöva ett semikolon efter DUAL , och helst en ny rad för COMMIT; . Men det anses generellt vara bättre inte att förbinda sig i en procedur, och låta den som ringer på toppnivån bestämma om den ska förbinda sig eller gå tillbaka för att bevara dataintegriteten.




  1. SSIS-paketet vill inte hämta metadata för temporär tabell

  2. kan inte släppa den främmande nyckeln

  3. Varför kan jag skapa en tabell med PRIMARY KEY på en nullbar kolumn?

  4. T-SQL trim   (och andra icke-alfanumeriska tecken)