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;