sql >> Databáze >  >> RDS >> Oracle

ORA-00933:Příkaz SQL nebyl správně ukončen při mazání dvou tabulek současně

Nemůžete smazat ze dvou tabulek v jednom příkazu – neexistuje žádný ekvivalent odstranění insert all . (Pokud nemáte omezení, která mazání kaskádují, nebo spouštěč, který to dělá ručně). Dokumentace ukazuje, že vaše syntaxe není platná, protože neexistuje žádná cesta k určení více než jedné tabulky.

Budete potřebovat dva příkazy delete, přičemž nejprve odstraníte záznamy z podřízené tabulky:

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

Mohli byste změňte omezení cizího klíče na delete cascade :

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

... což by znamenalo, že byste museli pouze explicitně odstranit z users stůl; ale to ve skutečnosti nemusí být to, co chcete, protože to odstraňuje jednu úroveň ověření - možná budete chtít zabránit náhodnému odebrání nadřazeného klíče, pokud má potomky. Vydání dvou smazání zde opravdu nebolí.

Mimochodem, váš první postup není spáchání, což byste mohli očekávat. V tomto řádku:

    ...
    SELECT * FROM DUAL COMMIT;

... COMMIT je interpretován jako alias pro DUAL tabulka, nikoli samostatný příkaz. Za DUAL byste potřebovali středník a pokud možno nový řádek pro COMMIT; . Ale obecně se to považuje za lepší ne provést potvrzení v proceduře a nechat volajícího nejvyšší úrovně rozhodnout, zda provést potvrzení nebo vrátit zpět, aby byla zachována integrita dat.




  1. Jak získat nejnovější záznamy o zaměstnancích v oracle?

  2. Jak změnit výchozí port MySQL/MariaDB v Linuxu

  3. MYSQL + PHP pro zobrazení dat ze dvou řádků jako jednoho sloupce

  4. Převést „datetime2“ na „datetimeoffset“ v SQL Server (příklady T-SQL)