Я получил 2 ошибки, сначала есть проигнорированный оператор plsql, а затем есть идентификатор, который нужно объявить? - PullRequest
0 голосов
/ 15 июня 2019

Я хотел преобразовать MySQL Trigger в Oracle Trigger, но есть две ошибки, которые не имеют никакого смысла для меня. Во-первых, игнорируется оператор PLSQL, а во-вторых, должен быть объявлен мой идентификатор.

Я попробовал несколько вещей, но все еще не нашел решения.

CREATE  OR REPLACE TRIGGER check_Zeitraum_Termin 
BEFORE INSERT ON Termin 
FOR EACH ROW
DECLARE
 Termin_Anzahl_Patient int;
 Termin_Anzahl_Arzt int;
 Termin_Anzahl_Mitarbeiter int;
BEGIN
SELECT COUNT(Patient_id) INTO Termin_Anzahl_Patient FROM Termin WHERE      Datum = :NEW.Datum AND Patient_ID = :NEW.Patient_ID AND Patient_ID IS NOT NULL;

IF (Termin_Anzahl_Patient > 0) 
THEN RAISE_APPLICATION_ERROR ( -20001,'Dieser Patient hat schon um diese Uhrzeit einen Termin');
END IF;

SELECT count(arzt_id) INTO Termin_Anzahl_Arzt FROM termin WHERE datum = :NEW.datum AND Arzt_ID = :NEW.Arzt_ID AND Arzt_ID IS NOT NULL;

IF (Termin_Anzahl_Arzt > 0)
THEN RAISE_APPLICATION_ERROR ( -20002,'Dieser Arzt hat schon um diese Uhrzeit einen Termin');
END IF;

SELECT count(Mitarbeiter_ID) INTO Termin_Anzahl_Mitarbeiter FROM Termin WHERE Datum = :new.Datum AND Mitarbeiter_ID = :NEW.Arzt_ID AND Mitarbeiter_ID IS NOT NULL;

IF Termin_Anzahl_Mitarbeiter > 0 
THEN RAISE_APPLICATION_ERROR ( -20003,'Dieser Mitarbeiter hat schon um diese Uhrzeit einen Termin');
END IF;

IF NEW.datum < NOW() 
    THEN RAISE_APPLICATION_ERROR ( -20004,'Dieser Patient hat schon um diese Uhrzeit einen Termin');
END IF;

  END; 
    /

1 Ответ

0 голосов
/ 15 июня 2019

Вы можете заменить IF NEW.datum < NOW() THEN на

IF :NEW.datum < systimestamp THEN или IF :NEW.datum < current_timestamp THEN, поскольку Oracle не содержит функции NOW().

И вам лучше объединить запросыв единицу путем преобразования в

SELECT count(case when nvl(Patient_ID,-1) = :new.Patient_ID then Patient_id end ), 
       count(case when nvl(Arzt_ID,-1) = :new.Arzt_ID then Arzt_ID end ), 
       count(case when nvl(Mitarbeiter_ID,-1) = :new.Mitarbeiter_ID then Mitarbeiter_ID end ) 
  INTO Termin_Anzahl_Patient, Termin_Anzahl_Arzt, Termin_Anzahl_Mitarbeiter
  FROM Termin 
 WHERE Datum = :NEW.Datum;

и размещения их сразу после BEGIN (поскольку эти переменные должны быть установлены до того, как они были использованы операторами IF), и предполагая, что эти значения ID неотрицательныцелые числа как всегда предпочтительнее.

...