PLS-00103:在期望以下之一时遇到符号 "IF":; <an identifier> <a double-quoted delimited-identifier>
PLS-00103: Encountered the symbol "IF" when expecting one of the following: ; <an identifier> <a double-quoted delimited-identifier>
我不断收到这些错误,但似乎无法理解原因。我是 oracle sql 的新手,欢迎任何帮助!提前致谢
CREATE OR REPLACE TRIGGER TRIGER1 AFTER DELETE OR INSERT ON LAB6_BILETI
FOR EACH ROW
DECLARE
CNT NUMBER;
CNP NUMBER;
BEGIN
SELECT COUNT(*) FROM T1 WHERE T1.T=:OLD.T INTO CNT
IF CNT=0 THEN
UPDATE T2 SET VP=1 WHERE T2.T=:old.T;
END IF;
SELECT COUNT(*) FROM T1 WHERE T1.T=:old.T AND T1.P=:old.P INTO CNP;
IF CNP=0 AND CNT!=0 THEN
UPDATE T2 SET VK=VK+1 WHERE T2.T=:old.T;
END IF;
END;
错误:
Compilation failed, line 6 (16:27:48)
The line numbers associated with
compilation errors are relative to the first BEGIN statement. This
only affects the compilation of database triggers.
PL/SQL: ORA-00933: SQL command not properly ended
Compilation failed, line 5 (16:27:48)
PL/SQL: SQL Statement ignoredCompilation failed, line 7 (16:27:48)
PL/SQL: ORA-00933: SQL command not properly endedCompilation failed, line 7 (16:27:48)
PL/SQL: SQL Statement ignored Compilation failed, line 11 (16:27:48)
PLS-00103: Encountered the symbol "IF" when
expecting one of the following:
; <an identifier> <a double-quoted
delimited-identifier>
您发布的触发器代码有几个语法错误和一些逻辑错误。
语法错误是
- 在常规 PL/SQL 中,INTO 子句直接出现在 SELECT 投影之后和 FROM 子句之前。
- 第一个 SELECT 语句后缺少分号。
逻辑缺陷是,对于 INSERT 触发器,:old
命名空间是空白的,因此选择的计数将始终为零并且更新将丢失。 (也许这就是您的意图,但如果是这样,您应该对代码进行注释以达到那种效果。)更改它并不像替换 :new
命名空间那么简单,因为在删除时它将是空白的。
CREATE OR REPLACE TRIGGER TRIGER1 AFTER DELETE OR INSERT ON LAB6_BILETI
FOR EACH ROW
DECLARE
CNT NUMBER;
CNP NUMBER;
l_t t1.t%type;
l_p t1.p%type;
BEGIN
if deleting then
l_t := :OLD.T ;
l_p := :OLD.P ;
else -- inserting
l_t := :NEW.T ;
l_p := :NEW.P ;
end if;
SELECT COUNT(*) INTO CNT
FROM T1
WHERE T1.T= l_t ;
IF CNT=0 THEN
UPDATE T2
SET VP=1
WHERE T2.T= l_t;
END IF;
SELECT COUNT(*) INTO CNP
FROM T1
WHERE T1.T= l_t
AND T1.P= l_p;
IF CNP=0 AND CNT!=0 THEN
UPDATE T2
SET VK=VK+1
WHERE T2.T= l_t;
END IF;
END;
我不断收到这些错误,但似乎无法理解原因。我是 oracle sql 的新手,欢迎任何帮助!提前致谢
CREATE OR REPLACE TRIGGER TRIGER1 AFTER DELETE OR INSERT ON LAB6_BILETI
FOR EACH ROW
DECLARE
CNT NUMBER;
CNP NUMBER;
BEGIN
SELECT COUNT(*) FROM T1 WHERE T1.T=:OLD.T INTO CNT
IF CNT=0 THEN
UPDATE T2 SET VP=1 WHERE T2.T=:old.T;
END IF;
SELECT COUNT(*) FROM T1 WHERE T1.T=:old.T AND T1.P=:old.P INTO CNP;
IF CNP=0 AND CNT!=0 THEN
UPDATE T2 SET VK=VK+1 WHERE T2.T=:old.T;
END IF;
END;
错误:
Compilation failed, line 6 (16:27:48)
The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PL/SQL: ORA-00933: SQL command not properly ended
Compilation failed, line 5 (16:27:48)
PL/SQL: SQL Statement ignoredCompilation failed, line 7 (16:27:48)
PL/SQL: ORA-00933: SQL command not properly endedCompilation failed, line 7 (16:27:48)
PL/SQL: SQL Statement ignored Compilation failed, line 11 (16:27:48)
PLS-00103: Encountered the symbol "IF" when expecting one of the following:
; <an identifier> <a double-quoted delimited-identifier>
您发布的触发器代码有几个语法错误和一些逻辑错误。
语法错误是
- 在常规 PL/SQL 中,INTO 子句直接出现在 SELECT 投影之后和 FROM 子句之前。
- 第一个 SELECT 语句后缺少分号。
逻辑缺陷是,对于 INSERT 触发器,:old
命名空间是空白的,因此选择的计数将始终为零并且更新将丢失。 (也许这就是您的意图,但如果是这样,您应该对代码进行注释以达到那种效果。)更改它并不像替换 :new
命名空间那么简单,因为在删除时它将是空白的。
CREATE OR REPLACE TRIGGER TRIGER1 AFTER DELETE OR INSERT ON LAB6_BILETI
FOR EACH ROW
DECLARE
CNT NUMBER;
CNP NUMBER;
l_t t1.t%type;
l_p t1.p%type;
BEGIN
if deleting then
l_t := :OLD.T ;
l_p := :OLD.P ;
else -- inserting
l_t := :NEW.T ;
l_p := :NEW.P ;
end if;
SELECT COUNT(*) INTO CNT
FROM T1
WHERE T1.T= l_t ;
IF CNT=0 THEN
UPDATE T2
SET VP=1
WHERE T2.T= l_t;
END IF;
SELECT COUNT(*) INTO CNP
FROM T1
WHERE T1.T= l_t
AND T1.P= l_p;
IF CNP=0 AND CNT!=0 THEN
UPDATE T2
SET VK=VK+1
WHERE T2.T= l_t;
END IF;
END;