我是想做一个带游标的存储过程,把所有HRB用户的 所有表 的 序列 自动到达可用位置(每次导入数据库,序列又从1开始,插入数据会重复ID)。因此我要得到一个视图,结构为: 表名 主键名 序列名通过以下代码我已经做出了: 表名 主键名   的视图,但是这个‘序列名’得不到--通过系统视图,得到所有的表及其主键 ,通过 all_constraints 和 all_cons_columns
select r1.table_name,r2.column_name from 
(select constraint_name ,table_name from all_constraints where owner = 'HRB' and constraint_type = 'P' and constraint_name not like '%BIN%') r1 
inner join
(select constraint_name,column_name from all_cons_columns where owner = 'HRB')  r2 
on r1.constraint_name = r2.constraint_name;
系统视图 all_sequences 根本没有和具体表关联的字段,所以连不起来,怎么办????急!回答立即结贴!

解决方案 »

  1.   

    由于得不到序列名,select XXX.nextVal from dual 。卡住了,XXX(序列名)得不到啊???
    TABLE_NAME                    COLUMN_NAME 
    ------------------------------ -------------------------------
    COMMON_ANSWER                  ANSWER_ID 
    COMMON_ANSWER_DETAILS          ANSWER_DETAILS_ID 
    COMMON_EXEM                    EXAM_ID 差一列 SEQUENCE_NAME
      

  2.   

    郁闷的是ALTER SEQUENCE RENAME ... TO ... 不顶用啊!看来只能改hibernate的映射文件了!!
      

  3.   

    select temp_seq.nextval as ass from dual 
    可以得到序列的值啊
    序列名么,
    select sequence_name,--序列名          min_value,--最小值          max_value,--最大值          increment_by,--序列的增量          cycle_flag,--是否循环,Y/N          order_flag,--是否有序,Y/N         cache_size,--保存于内存中序列的个数         last_number,--该序列缓存或生成的最后一个数字from user_sequences--他是数据字典的一部分;
      

  4.   

    序列跟表没有直接关联关系啊!你只能得到登录用户下面所有的序列名字:select sequence_name 序列名 from user_sequences
      

  5.   

    我们不是为每张需要自增的表都设定了一个序列吗?要不然当为一张表插入记录,Oracle怎么知到去让对应的序列值改变呢?我认为数据字典中应该有对应的视图....如果命名好点,把序列名命名为 seq_表名 ,那么就不用去查了。
      

  6.   

    晕倒啊,这个肯定做不到,从机制上来说,
    但是可以判断当前表最大的SEQUENCE存在的和当前的SEQ.CURRVAL比较,如果相等就是该SEQ,呵呵,比较无奈的做法
      

  7.   

    为每张表设定一个序列,大部分情况下我们是这么用的,但并非必须这样。可以将一个序列用在多个表上或其他地方。所以没有这样的数据字典
    重命名序列名可以这么做:
    rename OLDSEQNAME to NEWSEQNAME;
    但要注意,可能对应的触发器或过程中如果使用了旧的序列名,也要将里面的名称修改过来,否则会出错
      

  8.   

    我记得ORACLE好像没有自增的表吧一般是通过触发器实现自增长的
      

  9.   

    也没用的,每次重新导入数据库,所有的序列值都为1 。我就是为了解决这个问题,让序列值通过这个存储过程不断的 select xxx.nextval from dual。最终达到ID的最大值,这样插入数据就不会ID重复了。
      

  10.   


    thank you ! 你说的很对,而且序列重命名可以!SQL> rename USE_SEQ to UUSE_SEQ;Table renamed虽然提示是Table renamed ,但是确实序列名改了!哈哈!
      

  11.   

    没有设置触发器啊。我还是想进一步了解,如果没有对应的数据字典视图,那Oracle怎么知道那个序列对应那个或那些表呢??
      

  12.   

    Oracle不用知道,因为没有一个序列必须对应一个表这样的限制。一个序列对应一个表只是人为区分的
    你看看原来添加记录时是怎么为主键赋值的,从中可以找到对应的序列
      

  13.   

    为主键赋值就是把对应序列的值作为主键啊,没张表对应一个序列。Oracle不知道那怎么行呢,就算是一个序列对应几张表,那Oracle也该知道啊,因为Oracle要根据表记录的增加去改动对应的序列啊,要不然怎么知道是那个序列呢?
      

  14.   

    ....为表的主键字段赋序列值不是自动完成的,除了设置触发器
    比如为一个表插入数据,要用到序列,要用
    insert into table1(id,a,b,c) values(seq_a.nextval,'a','b','c');
    手动来调用
      

  15.   

    在ORACLE里,序列和表是多对多的关系。即一个序列可被多个表使用,同样,一个表也可以拥有多个由序列生成的列(貌似这样做比起前者来没什么意义)。
    年前曾经回答过一个类似的问题,要想将序列和表关联起来,需要在数据库设计阶段对象命名时人工标志出。否则,无论你怎么应用数据字典,都无法达到目的!
      

  16.   

           <id name="majorChangeId" type="long" column="MajorChangeId">
             <!-- 主键策略 -->
               <generator class="sequence">
                 <param name="sequence">sequence</param>
               </generator>
            </id>这个是hibernate的主键生成策略,为表的主键字段赋序列值是自动完成的.
      

  17.   


    那Oracle如何知道表与序列间的关系呢?
      

  18.   

    ORACLE只单独维护表、序列,而不维护表与序列的关系。序列不是表的必须组成部分,不像索引、表分区等必须属于某一个表。
    这一点在dba_dependencies里可以证实,没有TABLE&SEQUENCE的依赖。
      

  19.   

    至于你所说的表和序列的关系,是通过业务逻辑的SQL语句来维护。即:insert into table_name (column_name) values (seq_name.nextval);
      

  20.   

    是这样的,Hibernate维护了表和序列的关系,会发送这样一条语句的。
    哎呀,我弄错了。的却Orcle是不用知道的。因为我弄混淆了。
    Hibernate维护关系时,它知道那个表对应那个序列,从而发送select xxx.nextval from dual。
    这不是Oracle维护的。我的错啊,谢谢大家。特别是秀才和wildwave。