2011-10-11 88 views
1

我的应用程序需要知道哪个行接收数据库中的哪个密钥。Oracle 11g JDBC预取密钥

我正在使用JDBC读取批量更新提交的隔离级别。因此使用getGeneratedKeys检索密钥是不可能的。我的计划是以安全的交易方式从数据库中获取一系列ID,例如两个并行事务不能获得相同的密钥。

我可以使用未来行数作为参数来编写一些SQL查询以获取Oracle 11g中未来密钥的列表吗?

我在这里有什么选择?

回答

3

您可以使用序列用于此目的:

create sequence s; 

检索ID

select s.nextval from dual; 

或检索ID的范围:

select s.nextval from dual connect by level <= 10; 
+0

谢谢,您能否详细说明此方法的交易安全性?对于所有表格的所有自动递增键,双重魔法池塘? –

+0

如何知道哪张桌子需要钥匙? –

+0

您可以创建尽可能多的序列。每张表有一个序列并不罕见。从dual中选择table1_seq.nextval;从dual中选择table2_seq;等等。 –

2

只想补充:

有n o序列和表之间的明确关系。一个序列只是一个产生数字序列的机制。你可以假设一个序列永远不会产生重复的值,这就是它。不要假定顺序,并且肯定不指望没有间隙的顺序。在Oracle中按照这种方式完成序列设计。通过遵循这些规则,并且不对序列的行为做出其他假设,我们可以获得具有序列的极高可扩展性。请注意,只要您尝试执行订单或无间隙序列,您的表现就会受到严重影响。

总结: 1.)序列很简单,而且速度非常快。 2.)除了“没有dups”,不要以为你可以预测一个序列的行为。 3.)序列是独立的对象,与表格无关,可用于生成将在同一个表格或许多不同表格中使用的序列值。

希望有所帮助。