IN() 子句 oracle PLSQL 中的数组

Posted

技术标签:

【中文标题】IN() 子句 oracle PLSQL 中的数组【英文标题】:Array in IN() clause oracle PLSQL 【发布时间】:2013-03-09 02:07:25 【问题描述】:

我正在将字符串数组(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;

能否请您建议我如何使用,如果您想建议任何其他逻辑,那就太好了。

【问题讨论】:

我试过这个:AND p.plc_status IN (SELECT x.* FROM TABLE(plcListchar) AS x); 并且 Oracle 提出了 PLS-00642: local collection types not allowed in SQL statements 我也在寻找解决方案。 【参考方案1】:

假设您的集合是在 SQL 中定义的,而不仅仅是在 PL/SQL 中,您可以使用 TABLE 运算符(您发布的定义在语法上无效——您需要为 @ 指定长度987654323@)

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.

【讨论】:

嗨!我尝试了类似的方法,但出现错误。我发布了一个问题:***.com/questions/15516515/…。任何帮助将不胜感激。

以上是关于IN() 子句 oracle PLSQL 中的数组的主要内容,如果未能解决你的问题,请参考以下文章

oracle数组 拼到sql的in子句中去

使用 Oracle,我如何使用带有多个数组的 IN 子句?

oracle数组 拼到sql的in子句中去,比如String st=“A,B,G,H”这个字符串

Oracle In子句

使用列表中的in子句加入oracle [重复]

评估 Oracle IN 子句中的多个范围