ORACLE SQL TRIGGERS: PLS-00103: Обнаружен символ "(" при ожидании одного из следующего: - PullRequest
1 голос
/ 19 октября 2019

Здравствуйте. Я получаю сообщение об ошибке. PLS-00103: Обнаружен символ "(". При ожидании одного из следующих событий я не могу найти причину этой ошибки, пожалуйста, помогите мне. Спасибо

РЕДАКТИРОВАТЬ : исправитьвставленный код

CREATE OR REPLACE TRIGGER "SUNSHINE_DEPT"
BEFORE INSERT ON "PURCHASE"
FOR EACH ROW
DECLARE type VARCHAR2(7);
BEGIN 

    SELECT SERVICETYPE INTO type 
    FROM (
      SELECT P.SERVICETYPE, D.DNAME
      FROM DEPT D JOIN EMP E ON D.DEPTNO = E.DEPTNO JOIN PURCHASE P ON E.EMPNO = P.SERVEDBY
      WHERE D.DNAME = 'SALES - Sunshine' AND P.SERVEDBY IN (:NEW.SERVEDBY));

    IF type = 'Data Recovery' THEN
      :NEW.AMOUNT := :NEW.AMOUNT * 0.7;
    END IF;
    :NEW.PAYMENTTYPE := 'Cash';
END;
/

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Здесь:

FOR EACH ROW
DECLARE type VARCHAR2(7);
BEGIN 

type - это зарезервированное слово в Oracle . Вам нужно будет использовать другое имя для переменной.

В этой демонстрации для DB Fiddle триггер успешно компилируется:

CREATE OR REPLACE TRIGGER "SUNSHINE_DEPT"
BEFORE INSERT ON "PURCHASE"
FOR EACH ROW
DECLARE mytype VARCHAR2(7);
BEGIN 

    SELECT SERVICETYPE INTO mytype 
    FROM (
      SELECT P.SERVICETYPE, D.DNAME
      FROM DEPT D JOIN EMP E ON D.DEPTNO = E.DEPTNO JOIN PURCHASE P ON E.EMPNO = P.SERVEDBY
      WHERE D.DNAME = 'SALES - Sunshine' AND P.SERVEDBY IN (:NEW.SERVEDBY));

    IF mytype = 'Data Recovery' THEN
      :NEW.AMOUNT := :NEW.AMOUNT * 0.7;
    END IF;
    :NEW.PAYMENTTYPE := 'Cash';
END;
/
0 голосов
/ 19 октября 2019

Этот код выглядит некорректно:

SELECT SERVICETYPE INTO type
FROM (SELECT P.SERVICETYPE, D.DNAME
      FROM DEPT D JOIN
           EMP E
           ON D.DEPTNO = E.DEPTNO JOIN
           PURCHASE P
           ON E.EMPNO = P.SERVEDBY
      WHERE D.DNAME = 'SALES - Sunshine'
     ) AND P.SERVEDBY IN (:NEW.SERVEDBY);

) перед AND следует перемещать после последнего условия.

IN со столбцом такжеподозрительный. Однако это не приведет к ошибке компиляции, просто к непредвиденному поведению во время выполнения.

...