用动态sql
str varchar2(200);
str:='drop sequence ...';
execute immediate str;
str:='create sequence ...';
execute immediate str;

解决方案 »

  1.   

    create trigger a_tri
    before insert or update or delete on a
    for each row
    declare
    str varchar2(100);
    v_date varchar2(10);
    begin
    select max(col_date) into v_date from a;
    if to_char(sysdate,'yyyymmdd')>substr(v_date,1,8) then
    str:='drop SEQENCE ...';
    execute immediate str;
    str:='create SEQENCE ...';
    execute immediate str;
    end if;
    select seq_name.nextval into :new.id from a;
    end;
    /
      

  2.   

    谢谢楼上两位兄弟的回复:不过有一个问题,触发可以编译成功,但是插入更新的时候出现如下错误:
    ORA-04092: COMMIT 不能在触发器中
    ORA-06512: 在"HOT.TR_TESTID", line 8
    ORA-04088: 触发器 'HOT.TR_TESTID' 执行过程中出错  
     line 8 是:execute immediate str;              
    这是为什么??!!
      

  3.   

    你的oracle是什么版本,8i以下版本不支持execute immediate str
      

  4.   

    这是因为drop sequence 是一条DDL语句,将自动提交,也就相当于在TRIGGER中有COMMIT.
      

  5.   

    不会吧,我晕,:我的是oracle8i817版本的,也不可以吗?那有没有什么别的方法解决啊, beckhambobo兄帮帮忙啊,拜托拜托啦~
      

  6.   

    为什么非要删除呢,
    序列是可以重置的阿
    alter sequence aaaa MINVALUE
      

  7.   

    你可以创建一个job,每天晚上执行一次,让它调用存储过程把序列重置
      

  8.   

    817支持这种用法,805以下的不行触发器中不能使用commit语句
    检查一下你执行的语句,