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