不想使用序列,我建了一张表,表中仅两个字段,表名,最大ID值
存储过程getnextid带参数tablename in,nextid out,increment in
调用getnextid取得某个表的可用ID,getnextid怎么写?要用merge into吗:

解决方案 »

  1.   

    如果你的表名是动态的,得使用动态SQL来完成查询,然后把获取到的最大ID值+1赋给变量,以获取到可以用的ID,是这样吗?
      

  2.   

    试试:create table t_seqno (tname varchar2(100), tno number);
    insert into t_seqno values ('T1', 0);
    insert into t_seqno values ('T2', 0);
    commit;create or replace procedure getnextid 
    ( tablename varchar2, 
      nextid out number,
      incr number)
    is
      pragma autonomous_transaction;
    begin
      update t_seqno set tno = tno + incr where tname = tablename;
      select tno into nextid from t_seqno where tname = tablename;
      commit;
    exception
      when others then nextid := 0; rollback; 
    end;
      

  3.   

    这个简单,只要for update就可以了。
      

  4.   

    这样应该不行吧,把所有的tno都给改成tno+incr了,应该是先select max(tno),然后再是max(tno)+incr吧
      

  5.   

    我还是用一楼的做法,其实butchroller的代码我也大体写出来的,只不过不清楚并发安全的事,sjq521521有什么好建议吗?
      

  6.   

    一般不建议使用这种种子表。如果为了得到唯一主键,序列或者Sys_guid(),这个函数返回16byte长的数据库的唯一标识。。