web-dev-qa-db-fra.com

Tableau dans la clause IN () Oracle PLSQL

Je passe un tableau de chaînes (plcListchar) à la procédure stockée, je voudrais utiliser ce tableau de chaînes dans la clause IN ().

je ne peux pas utiliser plcListchar directement dans la clause IN (). Permettez-moi de montrer comment je crée un tableau de chaînes plcListchar en Java.

 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);

pour la mise en caisse CHAR_ARRAY,

create or replace type CHAR_ARRAY as table of varchar2;

je veux utiliser plcListchar dans la clause IN. ce qui suit est ma procédure stockée.

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;

Pourriez-vous s'il vous plaît me suggérer comment utiliser, si vous aimez suggérer une autre logique, c'est génial.

18
Ravichandra

En supposant que votre collection est définie en SQL, pas seulement en PL/SQL, vous pouvez utiliser l'opérateur TABLE (la définition que vous avez publiée n'est pas syntaxiquement valide - vous devez spécifier une longueur pour le VARCHAR2)

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

Puisque je n'ai pas vos tables, un exemple utilisant le schéma 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