我是想做一个带游标的存储过程,把所有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 根本没有和具体表关联的字段,所以连不起来,怎么办????急!回答立即结贴!
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 根本没有和具体表关联的字段,所以连不起来,怎么办????急!回答立即结贴!
TABLE_NAME COLUMN_NAME
------------------------------ -------------------------------
COMMON_ANSWER ANSWER_ID
COMMON_ANSWER_DETAILS ANSWER_DETAILS_ID
COMMON_EXEM EXAM_ID 差一列 SEQUENCE_NAME
可以得到序列的值啊
序列名么,
select sequence_name,--序列名 min_value,--最小值 max_value,--最大值 increment_by,--序列的增量 cycle_flag,--是否循环,Y/N order_flag,--是否有序,Y/N cache_size,--保存于内存中序列的个数 last_number,--该序列缓存或生成的最后一个数字from user_sequences--他是数据字典的一部分;
但是可以判断当前表最大的SEQUENCE存在的和当前的SEQ.CURRVAL比较,如果相等就是该SEQ,呵呵,比较无奈的做法
重命名序列名可以这么做:
rename OLDSEQNAME to NEWSEQNAME;
但要注意,可能对应的触发器或过程中如果使用了旧的序列名,也要将里面的名称修改过来,否则会出错
thank you ! 你说的很对,而且序列重命名可以!SQL> rename USE_SEQ to UUSE_SEQ;Table renamed虽然提示是Table renamed ,但是确实序列名改了!哈哈!
你看看原来添加记录时是怎么为主键赋值的,从中可以找到对应的序列
比如为一个表插入数据,要用到序列,要用
insert into table1(id,a,b,c) values(seq_a.nextval,'a','b','c');
手动来调用
年前曾经回答过一个类似的问题,要想将序列和表关联起来,需要在数据库设计阶段对象命名时人工标志出。否则,无论你怎么应用数据字典,都无法达到目的!
<!-- 主键策略 -->
<generator class="sequence">
<param name="sequence">sequence</param>
</generator>
</id>这个是hibernate的主键生成策略,为表的主键字段赋序列值是自动完成的.
那Oracle如何知道表与序列间的关系呢?
这一点在dba_dependencies里可以证实,没有TABLE&SEQUENCE的依赖。
哎呀,我弄错了。的却Orcle是不用知道的。因为我弄混淆了。
Hibernate维护关系时,它知道那个表对应那个序列,从而发送select xxx.nextval from dual。
这不是Oracle维护的。我的错啊,谢谢大家。特别是秀才和wildwave。