2016-08-04 2 views
0

私たちはVARCHAR2 2)カーソルの配列のパラメータで二つのパラメータ 1)とSPがありますに実装するシナリオ持ちでカーソルを移入する方法 - OutパラメータをPL SQL:ループ

配列に渡された各Valueに対してのみカーソルを設定し、このオープン/ポピュレートされたカーソルはJavaで使用されます。しかし、今まで私が見つけたことは、配列を処理しなければならない場合、ループを使って行う必要があるということです。 EXのために

Open Cursor_Name 
For 
For index In Arrar_Parameter.FIRST .. Arrar_Parameter.LAST 
LOOP 
    SELECT * FROM EMP WHERE EmpId = Arrar_Parameter[i] -------> This needs to be looped and not sure if this will work 
END LOOP 

は、我々はあなたの配列パラメータは、スキーマ・レベルであると仮定すると、この

Open Cursor_Name 
For 
SELECT * FROM EMP WHERE EmpId IN (Arrar_Parameter values) ------> To fetch/put all the array values at once without loop. 

親切に、このシナリオでは、カーソルを移入するホット示唆

+0

「配列」はどのデータ型ですか? –

+0

@AlexPoole ArrayはVarchar2(30)タイプの – PS078

+0

になります。それは 'varray'かネストしたテーブルですか?まあ、私はうまくいけば私の答えで両方をカバーしました。 –

答えて

1

のようないくつかのことを持つことができますvarrayまたはネストした表の場合は、a table collection expressionを使用できます。

table_collection_expressionを使用すると、query_およびDML操作の目的でcollection_expressionの値を表として処理する必要があることをOracleに通知できます。 collection_expressionは、サブクエリ、カラム、関数、またはコレクションコンストラクタです。その形式に関係なく、コレクション値、つまり型がネストされた表またはVARRAY型の値を戻す必要があります。コレクションの要素を抽出するこのプロセスは、コレクションのネスト解除と呼ばれます。

これはvarrayタイプ内蔵しかしあなた自身を置き換えることができます使用しています。

create procedure procedure_name (
    array_parameter sys.odcivarchar2list, cursor_name out sys_refcursor 
) as 
begin 
    open cursor_name for 
    select e.* 
    from table (array_parameter) a 
    join emp e on e.empid = a.column_value; 
end; 
/

希望する場合にもinを使用することができます。

create procedure procedure_name (
    array_parameter sys.odcivarchar2list, cursor_name out sys_refcursor 
) as 
begin 
    open cursor_name for 
    select * 
    from emp 
    where empid in (select column_value from table (array_parameter)); 
end; 
/

それは、ネストした表である場合をmember of構文を使用することもできます。

create type my_varchar2_table as table of varchar2(30); 
/

create procedure procedure_name (
    array_parameter my_varchar2_table, cursor_name out sys_refcursor 
) as 
begin 
    open cursor_name for 
    select * 
    from emp 
    where empid member of array_parameter; 
end; 
/
+0

おかげで@ @Alex Poole、ちょうどもう1つの提案が必要です....私たちがデータベースのこのVARCHAR2の配列を作成し、JAVAアプリケーションがJAVAの文字列配列でこのSPを呼び出すと、このSPの実装はうまくいくでしょうか? – PS078

+1

@ PS078を示唆している - 私はあなたが何を意味するのかよく分かりません。 [この回答](http://stackoverflow.com/a/21034016/266304)は、Java配列を 'varray'コレクションに変換する方法を示しています。これは数字用ですが、文字列に対しても同じように動作します。 –

+0

ありがとう@アレックスプール。私はあなたの提案を実装しようとすると問題を見つける場合にご連絡ください。ありがとう:) – PS078