Oracle
 sql >> Baza danych >  >> RDS >> Oracle

ORA-00933:Polecenie SQL nie zostało poprawnie zakończone podczas usuwania dwóch tabel jednocześnie

Nie możesz usunąć z dwóch tabel w jednej instrukcji - nie ma odpowiednika usunięcia insert all . (Chyba że masz ograniczenia, które kaskadowo usuwają, lub wyzwalacz, który robi to ręcznie). Dokumentacja pokazuje, że twoja składnia jest nieprawidłowa, ponieważ nie ma ścieżki do określenia więcej niż jednej tabeli.

Musisz mieć dwie instrukcje usuwania, najpierw usuwając rekordy z tabeli podrzędnej:

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

możesz zmień ograniczenie klucza obcego na delete cascade :

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

... co oznaczałoby, że musiałbyś tylko jawnie usunąć z users stół; ale może to nie być to, czego chcesz, ponieważ usuwa jeden poziom walidacji — możesz chcieć zapobiec przypadkowemu usunięciu klucza nadrzędnego, jeśli ma on dzieci. Wydanie dwóch usunięć tak naprawdę nie boli.

Nawiasem mówiąc, twoja pierwsza procedura nie zobowiązuje, czego możesz się spodziewać. W tej linii:

    ...
    SELECT * FROM DUAL COMMIT;

... COMMIT jest interpretowany jako alias dla DUAL tabela, a nie oddzielne polecenie. Potrzebujesz średnika po DUAL , a najlepiej nową linię dla COMMIT; . Ale ogólnie uważa się to za lepsze nie zatwierdzić w procedurze i pozwolić rozmówcy najwyższego poziomu zdecydować, czy zatwierdzić, czy wycofać, aby zachować integralność danych.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DBMS_APPLICATION_INFO.SET_CLIENT_INFO nie działa

  2. Łączenie wierszy Oracle SQL według okresów

  3. Wstaw zbiorczy do bazy danych Oracle:Co jest lepsze:pętla FOR Cursor czy prosty Select?

  4. oracle FOR LOOP nie wykonuje iteracji w SYS_REFCURSOR

  5. Dlaczego ta Oracle DROP COLUMN zmienia domyślną wartość innej kolumny?