Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORA-00933:SQL-Befehl wurde nicht ordnungsgemäß beendet, wenn zwei Tabellen gleichzeitig gelöscht wurden

Sie können nicht aus zwei Tabellen in einer Anweisung löschen - es gibt kein Äquivalent zum Löschen von insert all . (Es sei denn, Sie haben Einschränkungen, die das Löschen kaskadieren, oder einen Trigger, der dies manuell tut). Die Dokumentation zeigt, dass Ihre Syntax nicht gültig ist, da es keinen Pfad gibt, um mehr als eine Tabelle anzugeben.

Sie benötigen zwei Löschanweisungen, die zuerst die Datensätze aus der untergeordneten Tabelle entfernen:

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

Sie könnten Ändern Sie Ihre Fremdschlüsseleinschränkung in delete cascade :

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

... was bedeuten würde, dass Sie nur explizit aus den users löschen müssten Tisch; aber das ist vielleicht nicht das, was Sie wollen, da es eine Validierungsebene entfernt - Sie möchten vielleicht verhindern, dass ein übergeordneter Schlüssel versehentlich entfernt wird, wenn er Kinder hat. Zweimal löschen schadet hier nicht wirklich.

Übrigens ist Ihre erste Prozedur nicht verpflichtend, was Sie vielleicht erwarten. In dieser Zeile:

    ...
    SELECT * FROM DUAL COMMIT;

... das COMMIT wird als Alias ​​für den DUAL interpretiert Tabelle, kein separater Befehl. Sie benötigen ein Semikolon nach DUAL , und vorzugsweise eine neue Zeile für COMMIT; . Aber es gilt allgemein als besser nicht in einer Prozedur festschreiben und den Aufrufer der obersten Ebene entscheiden lassen, ob er festgeschrieben oder zurückgesetzt werden soll, um die Datenintegrität zu wahren.