触发器中创建一个Sequence!
为什么? 我想你的本意是用Sequence吧.
查找以前的贴子,很多的.
恕不重复

解决方案 »

  1.   

    如果确实要创建sequence,要将DDL语句当作动态SQL来处理。
    create or replace trigger testInsertTrigger
      AFTER INSERT
      on TEST
      
      for each row
    /* ERwin Builtin Mon Apr 21 12:01:18 2003 */
    /* default body for ProvinceInsertTrigger */
    declare 
     numrows INTEGER;
     v_str   varchar(1000);
    beginv_str :='create sequence TESTSEQUENCEssss minvalue 1 maxvalue 999999999999999999 start with 10 increment by 1 cache 20';
    execute immediate v_str;end;
    /
      

  2.   

    是这样:比如对客户编号,每个省都从1开始编号,那么,北京001,广州001,是否需要两个sequence?当然,可以用其他方法来实现。我只是想问问,这样的需求,在数据库中如何实现较好?对应有一个省的表(province)
      

  3.   

    you can design a table to simular the function .create table seq ( province varchar2(10),seq_no number)in your trigger select seq_no from seq where province = :new.province for update no wait 
    then update seq set seq_no = seq_no + 1 where province = :new.province
      

  4.   

    我明白你的意思,那样的话确实可以实现!只不过需要加锁!
     Lastdrop(空杯) 的答复是我想知道的。
    只是我我创建的Sequence 需要用插入的纪录中某一字段(:Pro_name)的纸为名称。
    比如,插入“jing”,sequence 的名称就是 jing_SEQ
      

  5.   

    那就把
    v_str :='create sequence TESTSEQUENCEssss minvalue 1 maxvalue 999999999999999999 start with 10 increment by 1 cache 20';改为
    v_str :='create sequence '||:new.pro_name||'_SEQ minvalue 1 maxvalue 999999999999999999 start with 10 increment by 1 cache 20';
      

  6.   

    我这么做了!可是为什么报“无法识别字符集名称”?
    是不是我的表健的有问题?Pro_name是varchar2(255)。
      

  7.   

    输入的pro_name是不是中文?
    你可以在执行v_str前,加上DBMS_OUTPUT.PUT_LINE('Pro name is '||:new.pro_name);把pro_name打印出来瞧瞧。别忘记在SQL*PLUS中执行set serveroutput on
      

  8.   

    “commit不能在触发器中”,是什么错误?谢谢!
      

  9.   

    触发器中是不能使用commit或rollback的。如果你是create sequence无需commit.
      

  10.   

    那就奇怪了!下面是我的触发器代码:
    create or replace trigger testInsertTrigger
      AFTER INSERT
      on TEST
      for each row
    /* ERwin Builtin Mon Apr 21 12:01:18 2003 */
    /* default body for ProvinceInsertTrigger */
    declare 
     numrows INTEGER;
     v_str   varchar(1000);
     v_temp varchar(20);
    begin
    v_temp := :new.Pro_name;
    v_str :='create sequence '||v_temp||'_SEQ minvalue 1 maxvalue 999999999999999999 start with 10 increment by 1 cache 20';
    execute immediate v_str;
    end;
      

  11.   

    是否与权限问题,
    grant create sequence to 当前用户;
      

  12.   

    查了一下资料,发现:
    A trigger cannot contain DDL or transaction control statements nor can it call stored procedures which do;