有两个表,Table1是放公告的,Table2是放附件的。
上传的时候先插如资料到Table1中,然后得到刚刚插入Table1中资料的NoticeID,根据这个NoticeID就得到了对应的DOCID(两者是一样的)再往Table2中插入附件资料
关键就在:在向Table1中插入资料后,返回了代表成功的rt(成功rt=1),这个NoticeID怎么得?(NoticeID是自增的),
我想用select Top1不怎么好,因为用户一多,就有可能同时操作。TOP1就不准,希望高手提点一下。

解决方案 »

  1.   

    这个可以使用序列,创建一个序列,
       CREATE SEQUENCE emp_sequence
      
      INCREMENT BY 1  -- 每次加几个
      START WITH 1   -- 从1开始计数
      NOMAXVALUE    -- 不设置最大值
      NOCYCLE     -- 一直累加,不循环
      CACHE 10;
      
      一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
      CURRVAL=返回 sequence的当前值
      NEXTVAL=增加sequence的值,然后返回 sequence 值
      比如:
      emp_sequence.CURRVAL
      emp_sequence.NEXTVAL
      

  2.   

    可以用行触发器吧,当你每次插入一行时,获取它的NoticeID值
    我只有个想法,具体不知道。
    等待学习!
      

  3.   

    ln_noticeid  NUMBER(30):=0;
    insert into ADM_BLT
      (NOTICEID, CLASS, SUBJECT, CONTENT, STATUS, CREATEBY, CREATEDATE)
    VALUES
      ('21', '公告', '维护3', '维护3', '1', 'takako', sysdate)  returning NOTICEID into ln_noticeid;ln_noticeid就是你刚插入的值。
      

  4.   

    用函数好像有问题。要用存储过程加个输出参数
    create or replace procedure f(rt out number) is
    begin
      insert into ADM_BLT
        (NOTICEID, CLASS, SUBJECT, CONTENT, STATUS, CREATEBY, CREATEDATE)
      VALUES
       ( '21','公告','维护3','维护3','1','takako', sysdate);
    rt:=1;
      dbms_output.put_line(rt);
    exception
      when others then
        rt := 0;
        dbms_output.put_line(rt);
    end f;
    然后再调用
      

  5.   

    可以就用序列好了。并发性的问题Oracle会帮你搞定的。序列的详细用法参考1楼说的。
    如果还有疑问我们需要更多的信息。
      

  6.   

    给个简单的sequence参考例子: create table t(pk number primary key,...); 
    create sequence t_seq; 
    create trigger t_trigger before insert on t for each row 
    begin 
      select t_seq.nextval into :new.pk from dual; 
    end;