【问题标题】:ORACLE SQL TRIGGERS: PLS-00103: Encountered the symbol "(" when expecting one of the following:ORACLE SQL 触发器:PLS-00103:在预期以下情况之一时遇到符号“(”:
【发布时间】:2019-10-19 12:30:09
【问题描述】:

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

【问题讨论】:

  • 大概该语句实际上以create trigger开头,而不是before insert。
  • 是的,我现在会编辑它,我的错

标签: sql oracle database-trigger


【解决方案1】:

这里:

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;
/

【讨论】:

    【解决方案2】:

    这段代码看起来不正确:

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

    【讨论】:

    • 我已经更正了代码,不小心粘贴了一个早期版本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2014-09-18
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多