Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql PLS-00103:遇到符号“;如果;当预期以下情况之一时:&书信电报;标识符>&书信电报;双引号分隔标识符>;_Sql_Oracle_Plsql_Database Trigger - Fatal编程技术网

Sql PLS-00103:遇到符号“;如果;当预期以下情况之一时:&书信电报;标识符>&书信电报;双引号分隔标识符>;

Sql PLS-00103:遇到符号“;如果;当预期以下情况之一时:&书信电报;标识符>&书信电报;双引号分隔标识符>;,sql,oracle,plsql,database-trigger,Sql,Oracle,Plsql,Database Trigger,我不断地犯这些错误,但似乎不知道为什么。我是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 THE

我不断地犯这些错误,但似乎不知道为什么。我是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;
错误:

编译失败,第6行(16:27:48)
与之关联的行号 编译错误与第一个BEGIN语句有关。这 仅影响数据库触发器的编译。
PL/SQL:ORA-00933:SQL命令未正确结束
编译失败,第5行(16:27:48)
PL/SQL:SQL语句忽略编译失败,第7行(16:27:48)
PL/SQL:ORA-00933:SQL命令未正确结束编译失败,第7行(16:27:48)
PL/SQL:SQL语句忽略编译失败,第11行(16:27:48)
PLS-00103:遇到符号“如果”时 应为以下情况之一:
;


您发布的触发器代码有几个语法错误和一些逻辑错误

语法错误是

  • 在常规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;

你应该在
选择COUNT(*)
之后将
带进CNP
带进CNT一样的东西
@BarbarosÖzhan我刚刚做了,我仍然会出错:/顺便说一句,我不知道你在用什么工具,但是与触发器编译错误相关联的行号是相对于第一个
begin
declare
的。在本例中,它指的是从xxx到yyy的
选择计数(*)行中的关键字顺序错误,这应该是@BarbarosÖzhan提到的从xxx到yyy的
选择计数(*)行。谢谢你,你甚至帮我解决了一个我不知道的问题!