现在有一数据表如下所示:
会议类型表(FS_ CONFERENCE_TYPE):记录会议类型信息序号 中文字段名 英文字段名 字段类型   长度 是否为空   主、外键
1 ID号          cnf_type_id  Number    14    F      主
2 会议类型名 cnf_type_name  Varchar2    100    F
3 操作员ID           User_ID           number     14    F 要求ID号为自增,规则为:4位当前年份+2位当前月份+2位当前日期+6位记录流水号,共14位。完全用触发器来实现
如:20060105000001
    20060105000002
    20080116000003
   .......................................
请问该如何解决。

解决方案 »

  1.   

    create or replace trigger TGNAME
    before insert on FS_ CONFERENCE_TYPE
    for each row
    begin
    :new.id:=to_char(sysdate,'yyyymmdd')||to_char(SEQNAME.nextval,'000000');
    end TGNAME;
      

  2.   


    to_char(SEQNAME.nextval,'000000');好像不对,我运行试了一下老提示错误
      

  3.   

    什么错误
    SEQNAME是指序列
    你自己创建序列,用你的序列名来代替这个序列名
    create sequence SEQNAME
    maxvalue 999999
    minvalue 1
    cycle;
      

  4.   

    你要先建一个SEQNAME
    create sequence EQNAME
    minvalue 000001
    maxvalue 999999
    start with 000001
    increment by 1
    cache 20;
      

  5.   

    是的我建立了一个序列,序列是从1开始每次增加1,最大值是增加到999999,而且还可以进行循环,但是报错:
       ora-04098:触发器‘SYSTEM.FS_AREA’无效且未通过重新确认。而我进行分部检查,日期转字符串没有错误,但是后面的自增好象不对,我转们定义了一个变量获取自增值,获取不到。
      

  6.   

    CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER" 
        BEFORE
    INSERT ON "FS_ CONFERENCE_TYPE" 
        FOR EACH ROW begin 
    :new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')||to_char(FS_CONFERENCE_TYPE_SEQUENCE.nextval,'000000'); 
    end
    ;
      

  7.   


    序列:
    CREATE SEQUENCE "SYSTEM"."FS_AREA_SEQUENCE" INCREMENT BY 1 START 
        WITH 42 MAXVALUE 999999 MINVALUE 1 CYCLE 
        CACHE 20 NOORDER触发器:CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER" 
        BEFORE
    INSERT ON "FS_ CONFERENCE_TYPE" 
        FOR EACH ROW begin 
    :new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')||to_char(FS_CONFERENCE_TYPE_SEQUENCE.nextval,'000000'); 
    end
    ;
      

  8.   

    你序列名写错了
    '000000'也稍改下,去掉空格
    to_char(system.FS_AREA_SEQUENCE.nextval,'fm000000')
      

  9.   


    CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER"
        BEFORE
    INSERT ON "FS_ CONFERENCE_TYPE"
        FOR EACH ROW begin
    select to_char(FS_CONFERENCE_TYPE_SEQUENCE.nextval,'000000') into :new.CNF_TYPE_ID from dual;
    :new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')||:new.CNF_TYPE_ID;
    end 
    这样看看。
    11g以前在触发器上不允许直接用FS_CONFERENCE_TYPE_SEQUENCE.nextval取数据的。
      

  10.   

    如下改~
    CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER"
        BEFORE
    INSERT ON "FS_ CONFERENCE_TYPE"
        FOR EACH ROW begin
    select to_char(system.FS_AREA_SEQUENCE.nextval,'fm000000') into :new.CNF_TYPE_ID from dual;
    :new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')||:new.CNF_TYPE_ID;
    end
      

  11.   

    上一个是我粘贴错了!是这样的
    序列:
    CREATE SEQUENCE "SYSTEM"."FS_CONFERENCE_TYPE_SEQUENCE" INCREMENT 
        BY 1 START WITH 21 MAXVALUE 1.0E28 MINVALUE 1 CYCLE 
        CACHE 20 NOORDER
    触发器:
    CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER" 
        BEFORE
    INSERT ON "FS_ CONFERENCE_TYPE" 
        FOR EACH ROW begin 
    :new.CNF_TYPE_NAME:=to_char(sysdate,'yyyymmdd')||to_char(system.FS_CONFERENCE_TYPE_SEQUENCE.nextval,'fm000000'); 
    end
    ;这样改后还是原来的问题
      

  12.   

    这个MAXVALUE设得太大了吧..
    你试试
    begin
    dbms_output.put_line(to_char(sysdate,'yyyymmdd')||to_char(system.FS_CONFERENCE_TYPE_SEQUENCE.nextval,'fm000000'));
    end;
    看看输出是否正确我测试了没问题
    你说的不正常表现在什么地方?
      

  13.   

       谢谢wildwave,hailang1118,kekinxinlin,谢谢你们的帮忙,这个帖子没有给分居然还能不厌其烦的帮助我,等我有分了,你们的分我当然记着要还,感恩呀,谢谢了
      

  14.   

    不是要修改ID吗。这么突然变成:new.CNF_TYPE_NAME了、
    CREATE OR REPLACE TRIGGER SYSTEM.FS_CONFERENCE_TYPE_TRIGGER
        BEFORE 
    INSERT ON FS_ CONFERENCE_TYPE 
        FOR EACH ROW begin 
    :new.cnf_type_id :=to_char(sysdate,'yyyymmdd')||to_char(system.FS_CONFERENCE_TYPE_SEQUENCE.nextval,'fm000000'); 
    end 
      

  15.   

    好啦?
    你说定义了变量来获取,我以为你使用select into了...分并不重要,即使没有分,还能分享到你的经验
      

  16.   

    我根据上面触发器获取到的是一个字符串,如果是给number类型的id字段加入后例如:20091110000023会变成:2009111023,这个又如何解决
      

  17.   

    这是因为你的序列值没有经过to_char转换
    to_char(system.FS_CONFERENCE_TYPE_SEQUENCE.nextval,'fm000000'))
    这样位数就统一了
      

  18.   

    再改CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER"
        BEFORE
    INSERT ON "FS_ CONFERENCE_TYPE"
        FOR EACH ROW
    DECLARE
    SEQ_VAR VARCHAR2(6);
     begin
    select to_char(system.FS_AREA_SEQUENCE.nextval,'fm000000') into SEQ_VAR  from dual;
    :new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')|| SEQ_VAR;
    end