почему я обнаружил, что команда PL / SQL: ORA-00933: SQL завершена некорректно? - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать триггер, который будет автоматически обновлять столбец) totaltripsmade в моей таблице DRIVER. Триггер сработает, когда запись о поездке будет вставлена ​​в мою таблицу TRIP.

Для начала у меня есть набор записей о поездках. Я думаю об использовании count (*) на моем Licence# в TRIP, чтобы обновить totaltripmade в ДРАЙВЕРЕ, поскольку в обеих таблицах есть Licence#.

Ниже мой код

create or replace trigger UpdateTTM 
  after insert on trip 
  for each row 

BEGIN
  LOOP 
  UPDATE DRIVER     
  SET totalTripMade = (select Lic# as L, count (*) as TTM FROM TRIP GROUP BY Lic# HAVING Lic# = Lic#)
  WHILE Lic# = L;
  END LOOP; 

end UpdateTTM;
/

Я новичок в SQL, и я не уверен, почему я сталкиваюсь с этой ошибкой, когда команда SQL не завершена должным образом. Я надеюсь, что найдутся люди, которые помогут мне решить эту проблему. Спасибо.

1 Ответ

0 голосов
/ 05 мая 2020

Вы получаете сообщение об ошибке, потому что это недопустимый синтаксис Oracle SQL. Вместо того, чтобы гадать или придумывать что-то, вам следует обратиться к документации Oracle , которая является исчерпывающей, онлайн и бесплатной. Мы можем легко решить большинство ошибок компилятора, сравнив наш код с приведенными примерами.

Но как только вы исправите оператор UPDATE, ваш триггер выдаст ошибку изменяющейся таблицы , потому что вы пытаетесь для выбора из TRIP в триггере, принадлежащем TRIP, и это не разрешено.

Самый простой способ сделать это:

create or replace trigger UpdateTTM 
  after insert on trip 
  for each row 

begin

  update driver
  set totalTripMade = nvl(totalTripMade,0) + 1
  where driver.Lic# = :new.Lic#;

end UpdateTTM;
/

Предполагается, что запись DRIVER существует до того, как запись TRIP будет создан. Если это не так, вам следует устранить дыру в вашей модели данных, прежде чем продолжить.

Кроме того, производительность не будет масштабироваться, и у вас по-прежнему будут проблемы с ее запуском в многопользовательских средах. Но это только проблемы в реальном мире, и этот вопрос попахивает домашним заданием.

...