2011-10-11 13 views
1

私のアプリは、どのローがデータベースのどのキーを受け取るかを知る必要があります。Oracle 11g JDBCプリフェッチ・キー

バッチ更新で読み取りコミットされた分離レベルでJDBCを使用しています。したがって、getGeneratedKeysでキーを取得することはできません。私の計画は、トランザクション安全な方法でデータベースからIDの範囲を取り出すことです。 2つの並列トランザクションは同じキーを取得できません。

Oracle 11gの将来のキーのリストを取得するために、将来の行数を引数としてSQL-Queryを記述できますか?

ここには何がありますか?

答えて

3

あなたは、この目的のための配列を使用することができます。

create sequence s; 

ID

select s.nextval from dual; 

またはIDの範囲を取得するために取得するために:

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

ありがとう、おそらくこのメソッドの安全性を説明できますか?すべてのテーブルのすべての自動インクリメントキーのためのデュアルマジカルポンドですか? –

+0

そして、デュアルはどのテーブルが鍵を必要としているかをどのように知っていますか? –

+0

好きなだけシーケンスを作成できます。 1つのテーブルにつき1つのシーケンスを持つことは珍しいことではありません。デュアルからtable1_seq.nextvalを選択します。デュアルからtable2_seqを選択します。 –

2

ちょうど追加したいです:

n個oシーケンスとテーブルの明示的な関係。シーケンスとは、単に数値シーケンスを生成するメカニズムです。シーケンスは決して重複した値を生成しないと仮定することができます。注文は受け付けません。は間違いなくにはギャップフリーのシーケンスはありません。 Oracleでは、このような順序でシーケンスが実行されます。これらのルールに従い、シーケンスの動作について他の仮定を行わないことで、シーケンスで非常にスケーラブルなパフォーマンスを得ることができます。オーダーやギャップのないシーケンスを実行しようとすると、パフォーマンスが大幅に低下することに注意してください。

要約: 1.)配列は死んでいる単純で、本当に速いです。 2.) "dups"以外では、シーケンスの動作を予測することはできません。 3.)シーケンスは、テーブルに結び付けられていない独立したオブジェクトであり、同じテーブルまたは多くの異なるテーブルで使用されるシーケンス値を生成するために使用できます。

希望に役立ちます。