简体   繁体   English

IN()子句oracle PLSQL中的数组

[英]Array in IN() clause oracle PLSQL

I am passing String array(plcListchar) to Stored Procedure, i would like to use this String array in IN() clause. 我将String数组(plcListchar)传递给Stored Procedure,我想在IN()子句中使用这个String数组。

i can not use plcListchar directly in IN() clause. 我不能直接在IN()子句中使用plcListchar。 Let me show how i am crating plcListchar string array in JAVA. 让我展示一下我是如何在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);

for crating CHAR_ARRAY, 用于装箱CHAR_ARRAY,

create or replace type CHAR_ARRAY as table of varchar2;

i want use plcListchar in IN clause. 我想在IN子句中使用plcListchar。 the following is my Stored Procedure. 以下是我的存储过程。

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;

Could you please suggest me how to use, if you like to suggest any other logic, it is great. 你能否建议我如何使用,如果你想提出任何其他逻辑,那就太好了。

Assuming that your collection is defined in SQL, not just in PL/SQL, you can use the TABLE operator (the definition you posted isn't syntactically valid-- you'd need to specify a length for the VARCHAR2 ) 假设您的集合是在SQL中定义的,而不仅仅是在PL / SQL中定义,您可以使用TABLE运算符(您发布的定义在语法上无效 - 您需要为VARCHAR2指定长度)

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

Since I don't have your tables, an example using the SCOTT schema 由于我没有您的表,因此使用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.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM