2011-08-05 6 views
1

私が書いているストアドプロシージャの一部(Oracle DB上)は、整数値の配列をC#アプリケーションに返します。私は以前これをやったことがないし、私はストアドプロシージャの内部でこれを行う方法についてオンラインで情報を見つけることができません。ストアドプロシージャの配列をループする方法、配列を返しますか?

私はDBに接続し、ストアドプロシージャコマンドを作成しました。私は使用しています:

cmd.Parameters.Add("returnID", OracleDbType.Array, ParameterDirection.Output); 

アレイを取得します。ストアドプロシージャの内部

、私が持っている:

returnIDsは整数のフル出力に私が欲しいのアレイ、ある
CREATE OR REPLACE PROCEDURE ODM(/* not relevant*/, returnIDs OUT ARRAY) 
IS 
BEGIN 
... 
END ODM; 

テーブルORDERSをループし、2つの値の間のすべての整数プライマリキーを取得してreturnIDに追加できる必要があります。

私は、主キーが最小値と最大値の間にある配列に挿入するのと似ていると思っていますが、わかりません。

これらの値を宣言し、テーブルをループして出力配列に追加する構文は何ですか?

EDIT:ソリューション:バルク収集はこれでうまくいくはずですが、最小値と最大値をプログラムに戻してそこで個別の選択を行うだけで簡単です。

答えて

5

ループする必要があるかどうかはわかりません。 ARRAYタイプの定義にもよりますが、おそらく

SELECT primary_key 
    BULK COLLECT INTO returnIDs 
    FROM orders 
WHERE primary_key BETWEEN low_value AND high_value 
+0

ありがとうございます。前に大量収集のことを聞いていない。私はそれを試みます。 – zomgcopters

+0

これを追加しました。うまくいくように見えますが、テストを開始するだけです。ありがとう! – zomgcopters

-1

私のdbの専門知識は、主にSQL ServerとFirebirdにあり、私は熟練したオラクル人ではありません。しかし、私はちょうど興味があったので、値を選択してC#アプリケーションに単純なデータテーブルやデータセットとして返すことはできません。しかし、それらをデータテーブルに保持するか、C#アプリケーションで配列やコレクションに変換することができますあなたは好きですか?

+0

に追加するだけです。基本的に私が言っていることは、値をフロントエンドに戻さずに、アレイ管理をフロントで処理するのはなぜですか?問題を簡単に解決できるだろうか? – Matt

+0

これは明らかに答えではありませんのでご了承ください – APC

+0

特定の日付に完了した「注文」を管理しています(手順に日付を入力しています)。 。 – zomgcopters

3

だから、何あなたが知る必要があることであることができます。

  1. 我々は、我々ができるOracleのbulk collect構文
  2. を使用して配列に挿入することができます各行にthe ROW_NUMBER() aggregate functionを使用して一意の番号を付けます。

このようなPL/SQL関数にそれらを一緒に入れてください:

SQL> create or replace type numbers_nt as table of number 
    2/

Type created. 

SQL> create or replace function get_range_of_numbers 
    2 (p_start in pls_integer 
    3  , p_end in pls_integer) 
    4  return numbers_nt 
    5 is 
    6 rv numbers_nt ; 
    7 begin 
    8  select empno 
    9  bulk collect into rv 
10  from 
11   (select empno 
12     , row_number() over (order by empno asc) rn 
13   from emp) 
14  where rn between p_start and p_end; 
15  return rv; 
16 end; 
17/

Function created. 

SQL> 

は、ロックしようぜ!

SQL> select * 
     2 from table(get_range_of_numbers(5, 8)) 
     3/

    COLUMN_VALUE 
    ------------ 
      7654 
      7698 
      7782 
      7788 

    SQL> 

うーん、私はあなたの質問を読み違えると思います。行の位置ではなくキーの値に基づいてレコードを選択したいと思うかもしれません。その場合、関数は単純に

create or replace function get_range_of_numbers 
    (p_start in pls_integer 
    , p_end in pls_integer) 
    return numbers_nt 
is 
    rv numbers_nt ; 
begin 
    select empno 
    bulk collect into rv 
    where emp between p_start and p_end; 
    return rv; 
end; 
/
+0

私はまたこのスレッドであなたのコメントを誤解しました。私が何を考えていたのか分かりません。これははるかに優れています。 – zomgcopters

関連する問題