大家帮忙给我看看我的触发器为什么不能运行啊,我想在每个月的某一天向表里面插一条记录。SQL语句都是对的,编译也能通过,但是就是不插入数据。这个例子是在今天插入记录的,但是早晨过来还是没有插入成功。
create or replace trigger insertHY
  before insert on tbl_zdsy_gsjfhysfb
for each row
declare
    newTime date;
    oldTime date;
    begin
  select YCSJ into  newTime from tbl_zdsy_ycsj_xx
      where rybs='4' and to_char(sysdate,'yyyy-mm')=to_char(YCSJ,'yyyy-mm');
  if(to_char(sysdate,'DD') ='20') then
    oldTime:=newTime;
   insert into tbl_zdsy_gsjfhysfb(HYBH,hymc,BIAOSHI,sbqx) values('0600','煤炭开采和洗选业','1',oldTime);
end if;
end;

解决方案 »

  1.   

    可以手工向tbl_zdsy_gsjfhysfb 插入数据,测试一下.
      

  2.   

    常规行[for each row]trigger不能修改触发表本身!!!CREATE OR REPLACE TRIGGER INSERTHY
      BEFORE INSERT ON TBL_ZDSY_GSJFHYSFB
      FOR EACH ROW
    DECLARE
      NEWTIME DATE;
      OLDTIME DATE;
    BEGIN
      SELECT YCSJ
        INTO NEWTIME
        FROM TBL_ZDSY_YCSJ_XX
       WHERE RYBS = '4'
         AND TO_CHAR(SYSDATE, 'yyyy-mm') = TO_CHAR(YCSJ, 'yyyy-mm');
      IF (TO_CHAR(SYSDATE, 'DD') = '20') THEN
        OLDTIME := NEWTIME;
        INSERT INTO TBL_ZDSY_GSJFHYSFB
          (HYBH, HYMC, BIAOSHI, SBQX)
        VALUES
          ('0600', '煤炭开采和洗选业', '1', OLDTIME);
      END IF;
    END;
    /
      

  3.   

    应该改为after insert吧create or replace trigger insertHY 
    after insert 
    on tbl_zdsy_gsjfhysfb 
    for each row 
    declare 
        newTime date; 
        oldTime date; begin 
      select YCSJ into  newTime from tbl_zdsy_ycsj_xx 
          where rybs='4' and to_char(sysdate,'yyyy-mm')=to_char(YCSJ,'yyyy-mm'); 
      if(to_char(sysdate,'DD') ='20') then     oldTime:=newTime; 
        insert into tbl_zdsy_gsjfhysfb(HYBH,hymc,BIAOSHI,sbqx) values('0600','煤炭开采和洗选业','1',oldTime); end if; 
    end; 
      

  4.   

    而且手工插入,和那些SQL都是对的。只是触发器不能插入数据。不了解这块,大家给我讲讲该怎么做啊。
      

  5.   

    试试这个:create or replace trigger insertHY 
      before insert on tbl_zdsy_ycsj_xx 
    for each row 
    declare 
        newTime date; 
        oldTime date; 
    begin 
      if(to_char(sysdate,'DD') ='20') and (:new.rybs = '4') and (to_char(sysdate,'yyyy-mm')=to_char(:new.YCSJ,'yyyy-mm')) then 
          insert into tbl_zdsy_gsjfhysfb(HYBH,hymc,BIAOSHI,sbqx) values('0600','煤炭开采和洗选业','1',:new.YCSJ); 
      end if; 
    end; 
      

  6.   


    用procedure,并使用job就可以了:CREATE OR REPLACE PROCEDURE INSERTHY IS
      NEWTIME DATE;
      OLDTIME DATE;
    BEGIN
      SELECT YCSJ
        INTO NEWTIME
        FROM TBL_ZDSY_YCSJ_XX
       WHERE RYBS = '4'
         AND TO_CHAR(SYSDATE, 'yyyy-mm') = TO_CHAR(YCSJ, 'yyyy-mm');
      IF (TO_CHAR(SYSDATE, 'DD') = '20') THEN
        OLDTIME := NEWTIME;
        INSERT INTO TBL_ZDSY_GSJFHYSFB
          (HYBH, HYMC, BIAOSHI, SBQX)
        VALUES
          ('0600', '煤炭开采和洗选业', '1', OLDTIME);
      END IF;
      COMMIT;
    END;
    /DECLARE
      JOBNO  NUMBER;
      INSTNO NUMBER;
    BEGIN
      DBMS_JOB.SUBMIT(JOBNO,
                      'INSERTHY;',
                      SYSDATE,
                      'TRUNC(SYSDATE)+1+2/(24*60)',
                      TRUE);
      COMMIT;
    END;
    /
      

  7.   

    oracledbalgtu,我想请问下你用的JOB是什么东西啊,数据库里面有这个吗,不太明白,我没有用过。谢谢你的答复。我看看,希望你能给我说的详细点。好吗。
      

  8.   

    注意:AFTER UPDATE的Trigger不能操作基表,只有在BEFORE INSERT的Trigger里才能操作基表。by oracle job
     detail...
    http://blog.csdn.net/simonezhlx/archive/2009/03/20/4006795.aspx