2010-12-01 10 views
2

以下のロジックを実行するには、少しストアドプロシージャが必要ですか?シーケンスIDのリストを返すストアドプロシージャ

PROCEDURE_NAME
return_idsをBLOCK_COUNTするために1から

ループ(VARCHAR2、IN SEQ_NAME(50)、int型、IN BLOCK_COUNTは、OUT return_ids):= 'SEQ_NAME' ||デュアルから.nextValを選択します。
エンドループ
戻りreturn_ids

は基本的に私が何をしたいのか、私は私が必要とするどのように多くのID、シーケンス名を渡すと私に戻ることができますストアドプロシージャを持って発生した私ができるIDのリストされていますJAVAで使用する。私のためにこれを行う理由は、私がJAVAで使用できるIDのリストを返し、誰もそれらのシーケンスIDを使用していないからです。後でラインの下の他のバルクインサートで使用されます。本質的に、シーケンスIDのブロックを予約する。

答えて

1

私は、レコードがデータベースに挿入される前にIDを生成する必要があるというロジックについて懸念しています。

また、最初に行を挿入し、行からIDを選択してから、一括操作を行うために更新ステートメントを使用することをお勧めします。しかし、これは、実際の情報が挿入される準備ができるまでは、JavaコードがIDに依存しないようにするほど好ましい方法ではありません。

XML(またはデータベースが理解できる他のデータ形式)に情報をプッシュし、一括挿入を行うストアドプロシージャを呼び出すことができます。

+0

DBAをサポートしていれば、プロシージャに配列を渡して、DB側のすべての挿入を処理させるだけです。しかし、私はサポートを持っていないので... – stuckAtWork

+0

関連する階層テーブルに多数のレコードを挿入しようとしています。トップレベルのテーブルからIDが必要なので、2番目のレベルのテーブルに挿入することができます.3番目と4番目のレベルのテーブルなどに挿入することができます。私はまた、私が挿入している間に毎回IDを取得するためにDBを呼び出すためにJDBCを使用したくありません。私は配列の配列をバッチインサートで使用できるように、さまざまな配列を取り込むことができるSEQ_IDのブロックをプリフェッチしたいだけです。 – stuckAtWork

+0

DBAのサポートを受けていないというご意見がありましたら、私は混乱しています。ストアドプロシージャを作成してIDを予約することはできますが、正しいIDを持つ各テーブルに挿入を実行するストアドプロシージャは作成できません。 –

3

PL/SQLプロシージャから配列を戻す方法の1つです。

数値のコレクション型を作成し、プロシージャで初期化して数値に変換して戻します。たとえば:

create or replace type narray as table of number; 

create or replace procedure get_seq_ids(seq_name in varchar2, 
    block_count in number, return_ids out narray) 
as 
begin 
    return_ids := narray(); 
    return_ids.extend(block_count); 
    for i in 1 .. block_count 
    loop 
     execute immediate 'select ' || seq_name || '.nextval from dual' 
      into return_ids(i); 
    end loop; 
end; 
/
+0

おかげでvls、それだけで私が必要なものです! – stuckAtWork

0

IMHO、あなたができる最善のことは、ちょうどVALUES句の中で、あなたのINSERT INTOsequence_name.nextval右を参照しています。

あなたは、同じIDを使用する他の人は避けたいとしました。 this siteを参照:

シーケンス(またはOracle、そのことについては)同じセッション内でのnextvalする他のセッションまたは他の呼び出しがシーケンスから同じ番号を取得していないことを保証します。

したがって、シーケンス番号の一意性はOracleでは保証されています。ここで

+0

問題は、パフォーマンス上の理由からDML操作を一括処理し、INSERT内のnextvalコールを残しておくと、子レコードを挿入する前にそのIDを取得するという後続の問合せを意味するアプリケーションの問題です。これは、多くの行を持続させなければならないアプリケーションのためのDBとの多くの前後の話です。 – kurosch

0

はそれだけでアプリがテーブルを使用したよりも、Javaへのカーソルを渡すために簡単だった

PROCEDURE get_nextvals 
( 
    p_values OUT SYS_REFCURSOR, 
    p_count IN PLS_INTEGER 
) 
IS 
    -- return the next p_count values from the PK sequence 
BEGIN 
    OPEN p_values FOR 
     SELECT 
      <schema>.<sequence>.nextval 
     FROM 
      dual 
     CONNECT BY 
      LEVEL <= p_count 
    ; 
END; 

(も深く階層テーブルに一括挿入を使用している)私は私がサポートし、Javaアプリケーションのために何をすべきかですDBに定義された型。

+0

また、私はテーブルタイプの方法で作業していますが、違いがあるかどうかを確認するためにこの方法を試してみます。みんなありがとう! – stuckAtWork

1

もう1つのオプションは、挿入後にシーケンス値を自動的に返すためにRETURNING句を使用することです。