苦恼啊,本人使用的数据库不是oracle,
如何才能实现oracle sequence的功能?
各位有这方面的经验吗?

解决方案 »

  1.   


       Create Table sequence_maker ( sequence_no number default 0 , sequence_type varchar2(3))   At time of geting the key , fetch sequence_maker table to get the max(sequence_no)+1 insert into your_table . Then Update sequence_no = sequence_no + 1 in sequence_maker table. (sequence_type is used for in case you have more tables need to generate the PK)
      

  2.   

    给你一个ORACLE存储过程,我们用它来生产主建数的:
    PROCEDURE "GETSERIES" (
        vl_name IN VARCHAR2,
        vl_id   IN VARCHAR2,
        vl_len  IN INTEGER,
        vl_out OUT VARCHAR2
     )
    IS
        cnt  INTEGER;
        temp INTEGER;
        vl_zz VARCHAR(30);
    BEGIN
        SELECT count(*) INTO temp FROM t_sysinfo WHERE
            rtrim(INFONAME)=rtrim(vl_name);
        IF (temp<>0) THEN
        BEGIN
          SELECT info INTO temp FROM t_sysinfo WHERE rtrim(INFONAME)=rtrim(vl_name);
          temp:=temp+1;
          UPDATE t_sysinfo SET info=temp WHERE rtrim(infoname)=rtrim(vl_name);
        END;
        ELSE
        BEGIN
         temp:=1;
         INSERT INTO t_sysinfo(infoname,info) VALUES(vl_name,to_char(temp));
        END;
        END IF;    SELECT
    concat(substr('00000000000000000000',1,20-length(to_char(temp))),to_char(temp))               c into  vl_zz      FROM dual;    if vl_id is not null  then
           SELECT
           concat(RTRIM(vl_id),substr(vl_zz,21-vl_len+length(RTRIM(vl_id)),vl_len)) c         into vl_out
           FROM dual;
        else
            SELECT
            substr(vl_zz,21-vl_len,vl_len) c into vl_out
            FROM dual;
        end if;
    END;
      

  3.   

    if there are some application,
    they all use this table, then this table must be locked, right?
    Is it complicated to do that? And how to do that?
    Thanks in advance!
      

  4.   

    非常感谢fanzhaoyou, 可以我用的数据库不支持存储过程.
      

  5.   

    我用的是公司内部的数据库,是一种OODB,做的不够完善.
    顺便问一下有没有用JAVA开发面向对象数据库的?
      

  6.   

    不用oracle的max函数如何查询取得最大值?
      

  7.   

    你的rdbms到底能支持那些功能?如果这些都不支持的话,怎么能算是一个完整的rdbms呢?还是用一个表来存放当前记录号,每次select以后加一来控制吧
      

  8.   

    那你就用另外一个表专门记住最大值,每次update 就行了。
      

  9.   

    多谢各位指点,有用过oodb(object oriented database)开发的吗?
      

  10.   

    你的具体数据库是一个什么数据库,ORACLE也支持OODB,只要自己按需创建合适的对象也行。
      

  11.   

    以下是从一篇文章(非程序员杂志www.umlchina.com中)中摘抄,用来生成对象标识OID.许多数据库,如Oracle,能自动的产生唯一的序列值。尽管该方案可以很好的工作,但它们采用了厂商私有的方法,且在定义时确定,从而无法进行有效地控制。如果面临跨平台移植时,可能成为非常严重的问题。替代使用较大整数来获取OID 的方法(要求对单个资源——字段进行访问,从而成为瓶颈):将OID 分解为两个逻辑组成部分。在应用程序首次需要创建OID 时,向数据库的单个字段请求HIGH 值(或者从某些数据的内建函数获得),对于LOW 值,初始化为0,在本次会话随后的请求递增。如果LOW 值到达了极限,则再次向数据库申请HIGH 值。由于HIGH 值互斥的获得,进而保证了唯一性。
    HIGH/LOW 方法的优点,每次会话只需与数据库交互一次,减少了流量,使键值表的访问不再成为瓶颈。其次,保证了OID 在所有对象中的唯一性。
    与前面所提到的方法比较,HIGH/LOW 方法是最有效和实现较简易的方法其基本思想是在创建永久对象:由ObjectFactory 对象(可参见创建设计
    模式中的Singleton)为它分配OID,ObjectFactory 的唯一职责创建新的OID 对象。ObjectFactory 跟踪HIGH和LOW 的取值来得到新的OID。具体而言,通过访问Persistence 机制(数据库)来获取HIGH,而基于LOW 的当前值返回唯一的OID。asColumns 方法则以关系数据库存储的对应形式返回OID 的实例。
      

  12.   

    我也借光UP一下,我的问题与此有关,我们开发一套系统要跨数据库,要求换后台数据库程序代码不变。同时支持SQL 2000和ORACLE, 在SQL2000里有字段设为自增,但ORACLE里没,虽然可以用SEQUENCE,但程序代码就不一样了,各给有何高见?
      

  13.   

    同意"不写代码"的意见,创建一个对象,用于创建SID
      

  14.   

    我可以用单独一个表来存sequence值,但是我用的数据库又
    不支持lock,请教各位大侠.
    如何产生sequence值, 我用的数据库不支持事物和lock.
    我使用jdbc和oracle.
    多谢!
      

  15.   

    对不起,刚才写错了,我用的不是oracle.
      

  16.   

    我用的是公司内部的数据库,是一种OODB,做的不够完善.
    顺便问一下有没有用JAVA开发面向对象数据库的?如果你要的是对象访问数据库的产品,可以使用toplink,详细情况你可以到webgain的官方网站www.webgain.com
      

  17.   

    select to_char(to_number(max(id))+1) from table1;
      

  18.   

    用表存sequence值就可以了,不支持事务和锁
    没关系。
    查询之前先加1就行了,只是不能保证连号