下面是小弟写的一个触发器,重复代码太多,而且容易出错,但我自己又不会简化写法,希望大家能帮个忙,给简化一下.这触发器的主要目的就是,在DBZ1101表里插入数据的时候,判断一下系统时间是不是整点,如果是的话,就取前一小时的数据平均值插入到DBZ1101_H表里.
CREATE OR REPLACE TRIGGER DBZ1101_TRI
AFTER INSERT
ON DBZ1101
FOR EACH ROWBEGIN
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '00:55:00' AND '01:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '00:00:00' AND '00:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '01:55:00' AND '02:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '01:00:00' AND '01:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '02:55:00' AND '03:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '02:00:00' AND '02:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '03:55:00' AND '04:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '03:00:00' AND '03:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '04:55:00' AND '05:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '04:00:00' AND '04:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '05:55:00' AND '06:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '05:00:00' AND '05:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '06:55:00' AND '07:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '06:00:00' AND '06:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '07:55:00' AND '08:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '07:00:00' AND '07:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '08:55:00' AND '09:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '08:00:00' AND '08:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '09:55:00' AND '10:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '09:00:00' AND '09:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '10:55:00' AND '11:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '10:00:00' AND '10:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '11:55:00' AND '12:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '11:00:00' AND '11:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '12:55:00' AND '13:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '12:00:00' AND '12:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '13:55:00' AND '14:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '13:00:00' AND '13:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '14:55:00' AND '15:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '14:00:00' AND '14:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '15:55:00' AND '16:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '15:00:00' AND '15:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '16:55:00' AND '17:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '16:00:00' AND '16:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '17:55:00' AND '18:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '17:00:00' AND '17:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '18:55:00' AND '19:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '18:00:00' AND '18:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '19:55:00' AND '20:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '19:00:00' AND '19:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '20:55:00' AND '21:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '20:00:00' AND '20:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '21:55:00' AND '22:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '21:00:00' AND '21:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '22:55:00' AND '23:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '01:00:00' AND '22:59:00';
  END IF;
  IF To_Char(SYSDATE,'HH24:MM:SS')   BETWEEN '23:55:00' AND '24:05:00'  THEN
    INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN '23:00:00' AND '23:59:00';
  END IF;
END;

解决方案 »

  1.   

    IF (substr(To_Char(SYSDATE,'HH24:MM:SS'),4,2)-'30')<'25'  THEN 
        INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 ;
    END IF; 
      

  2.   

    TRY:IF To_Char(SYSDATE,'MM')>= 55   THEN 
       INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN BETWEEN TO_CHAR(SYSDATE+1/24,'HH24')||':00:00' AND TO_CHAR(SYSDATE+1/24,'HH24')||':59:00';
    ELSIF AND To_Char(SYSDATE,'MM')<=5 THEN
       INSERT INTO DBZ1101_H SELECT SYSDATE,Avg(YL),Avg(YC),Avg(GD),Avg(ZLLL),Avg(RL),Avg(WD),Max(LJLL) FROM DBZ1101 WHERE CJSJ BETWEEN TO_CHAR(SYSDATE,'HH24')||':00:00' AND TO_CHAR(SYSDATE,'HH24')||':59:00';
    END IF; 
      

  3.   

    直接用一句,通过SYSDATE计算出后面的时间参数。