ORACLE SQL 触发器:PLS-00103:遇到以下符号之一时遇到符号“(”:

ORACLE SQL TRIGGERS: PLS-00103: Encountered the symbol "(" when expecting one of the following:

您好,我收到错误 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;
/

此代码看起来不正确:

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同一个栏目也很可疑。但是,这不会导致编译错误,只会导致运行时的意外行为。

这里:

FOR EACH ROW
DECLARE type VARCHAR2(7);
BEGIN 

type 是一个 reserved word in Oracle。您需要为变量使用另一个名称。

在这个demo on 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;
/