web-dev-qa-db-ja.com

IN()句の配列Oracle PLSQL

文字列配列(plcListchar)をストアドプロシージャに渡しています。この文字列配列をIN()句で使用したいと思います。

iN()句でplcListcharを直接使用することはできません。 JavaでplcListchar文字列配列を作成する方法を示します。

 String array[] = {"o", "l"}; 
 ArrayDescriptor des = ArrayDescriptor.createDescriptor("CHAR_ARRAY", con);
 ARRAY array_to_pass = new ARRAY(des,con,array);            
 callStmtProductSearch.setArray(4, array_to_pass);

cHAR_ARRAYを作成する場合、

create or replace type CHAR_ARRAY as table of varchar2;

iN句でplcListcharを使用します。以下は私のストアドプロシージャです。

CREATE OR REPLACE PROCEDURE product_search(
            status IN varchar2, 
            plcList IN varchar2,
            i_culture_id IN number,
            plcListchar IN CHAR_ARRAY,
            status_name OUT  varchar2, 
            culture_code  OUT varchar2)
AS  
    CURSOR search_cursor IS
    SELECT p.status_name, p.culture_code
                FROM PRISM_ITEM_cultures@prism p
                WHERE p.publishable_flag=1 
                AND p.isroll =0 
                AND status = '-1'
                AND p.plc_status IN (   );
 BEGIN
           OPEN search_cursor;
           FETCH search_cursor INTO status_name, culture_code ;
           CLOSE search_cursor;
 END;

他のロジックを提案したい場合は、使用方法を教えてください。

16
Ravichandra

コレクションがPL/SQLだけでなくSQLで定義されていると仮定すると、TABLE演算子を使用できます(投稿した定義は構文的に有効ではありません。VARCHAR2の長さを指定する必要があります) )

AND p.plc_status IN (SELECT column_value
                       FROM TABLE( plcListchar ))

テーブルがないので、SCOTTスキーマを使用した例

SQL> create type ename_tbl is table of varchar2(30);
  2  /

Type created.

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_enames ename_tbl := ename_tbl( 'KING', 'SMITH' );
  3  begin
  4    for i in (select *
  5                from emp
  6               where ename in (select column_value
  7                                 from table( l_enames )))
  8    loop
  9      dbms_output.put_line( 'ENAME = ' || i.ename );
 10    end loop;
 11* end;
SQL> /
ENAME = KING
ENAME = SMITH

PL/SQL procedure successfully completed.
23
Justin Cave