PLS-00103: обнаружен символ » » при ожидании одного из следующих символов: := . ( @ % ; не нулевой диапазон по умолчанию

#oracle #plsql

#Oracle #plsql

Вопрос:

Почему это не работает? Любые советы или решения приветствуются.

 CREATE OR REPLACE TRIGGER OverReading
    BEFORE UPDATE OR INSERT ON MeterReadings
    FOR EACH ROW
DECLARE
    emp_counter INTEGER;
    max_meter INTEGER : = 5;
BEGIN
    SELECT COUNT(EmployeeId) INTO emp_counter
    FROM MeterReadings 
    WHERE EmployeeId = :NEW.EmployeeId;
IF : OLD.EmployeeId = NEW.EmployeeId THEN
    RETURN;
ELSIF emp_counter >= max_meter THEN
    raise_application_error(-20900,'Employee are limited to a maximum of 5 meters');
END IF;
END;
/
  

Ошибка, которая выдается мне
введите описание изображения здесь

Ответ №1:

Три синтаксические ошибки, все они связаны с : символом.

Когда исправлено, триггер компилируется:

 SQL> CREATE OR REPLACE TRIGGER OverReading
  2      BEFORE UPDATE OR INSERT ON MeterReadings
  3      FOR EACH ROW
  4  DECLARE
  5      emp_counter INTEGER;
  6      max_meter INTEGER := 5;                       --> here
  7  BEGIN
  8      SELECT COUNT(EmployeeId) INTO emp_counter
  9      FROM MeterReadings
 10      WHERE EmployeeId = :NEW.EmployeeId;
 11  IF :OLD.EmployeeId = :NEW.EmployeeId THEN        --> 2x here
 12      RETURN;
 13  ELSIF emp_counter >= max_meter THEN
 14      raise_application_error(-20900,'Employee are limited to a maximum of 5 meters');
 15  END IF;
 16  END;
 17  /

Trigger created.

SQL>
  

Однако: этот код будет выполняться, если вы вставляете строки одну за другой. В противном случае это вызовет ошибку изменения таблицы при выборе из той же таблицы, в которую вы вставляете (что недопустимо). Если это вас беспокоит, есть способы это исправить. В зависимости от используемой версии базы данных это может быть составной триггер или опция type package .