2015-10-15 81 views
1

我能够查询逗号分隔IN参数在PLSQL到目前为止参照Query with comma seperated IN parameters in PLSQL。和完美的工作。我的问题如何为至少3个逗号分隔的参数实现这个相同的解决方案。我的查询参数是这样的,逗号分隔查询PLSQL中的多个参数

I_PRODUCT query (R%, L%) 
I_MODEL query (E%,T%,R%) 
I_TYPE query (A5,B%,C%) 

作为函数调用并调用所有这些参数是否很好?其他快速解决方案?

create or replace PROCEDURE RQUERY1 
(
I_PRODUCT VARCHAR2 
I_MODEL VARCHAR2 
I_TYPE VARCHAR2 
, O_Cursor OUT SYS_REFCURSOR 

) AS BEGIN 
O_Cursor := NULL; 

OPEN O_Cursor FOR 
WITH PROD_SEARCH AS 
(
    select regexp_substr(I_PRODUCT,'[^,]+', 1, level) pattern from dual 
    connect by regexp_substr(I_PRODUCT, '[^,]+', 1, level) is not null 
) 
SELECT * FROM table1 
    WHERE EXISTS (SELECT NULL FROM PROD_SEARCH WHERE table1.PRODUCT LIKE pattern); 
END RQUERY1 ; 

更新:我期待使用存储过程从我的Java代码查询参数(I_PRODUCT,I_MODEL,I_TYPE)和需要显示输出值。

回答

0

编辑:

我终于明白你想要什么。

如上所述here,您可以使用语句定义多个。所以,你可以写这样的:

OPEN O_Cursor FOR 
WITH PROD_SEARCH AS 
(
    select regexp_substr(I_PRODUCT,'[^,]+', 1, level) pattern from dual 
    connect by regexp_substr(I_PRODUCT, '[^,]+', 1, level) is not null 
), 
MODEL_SEARCH AS 
(
    select regexp_substr(I_MODEL,'[^,]+', 1, level) pattern from dual 
    connect by regexp_substr(I_MODEL, '[^,]+', 1, level) is not null 
), 
TYPE_SEARCH AS 
(
    select regexp_substr(I_TYPE,'[^,]+', 1, level) pattern from dual 
    connect by regexp_substr(I_TYPE, '[^,]+', 1, level) is not null 
) 
SELECT * FROM table1 
    WHERE EXISTS (SELECT NULL FROM PROD_SEARCH WHERE table1.PRODUCT LIKE pattern) 
AND EXISTS (SELECT NULL FROM MODEL_SEARCH WHERE table1.MODEL LIKE pattern); 
AND EXISTS (SELECT NULL FROM TYPE_SEARCH WHERE table1.TYPE LIKE pattern); 
END RQUERY1 ; 
+0

更新我的问题象下面这样:我希望使用存储过程从我的java代码中查询参数(I_PRODUCT,I_MODEL,I_TYPE),并需要显示输出值。 – SamK

+0

@KodS我*认为*我明白你想要什么。编辑答案。 –

+0

谢谢,这正是我正在寻找的 – SamK

2

使用集合:

CREATE OR REPLACE PROCEDURE RQUERY1 
(
I_PRODUCT IN SYS.ODCIVARCHAR2LIST, 
I_MODEL IN SYS.ODCIVARCHAR2LIST, 
I_TYPE IN SYS.ODCIVARCHAR2LIST, 
O_Cursor OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    OPEN O_Cursor FOR 
    SELECT t.* 
    FROM table1 t 
     INNER JOIN TABLE(I_PRODUCT) p ON t.PRODUCT = p.COLUMN_VALUE 
     INNER JOIN TABLE(I_MODEL ) m ON t.MODEL = m.COLUMN_VALUE 
     INNER JOIN TABLE(I_TYPE ) y ON t.TYPE = y.COLUMN_VALUE; 
END RQUERY1; 
/

然后就可以调用它在Java中是这样的:

import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import oracle.jdbc.OracleCallableStatement; 
import oracle.jdbc.internal.OracleTypes; 
import oracle.sql.ARRAY; 
import oracle.sql.ArrayDescriptor; 

public class TestDatabase { 
    public static void main(String args[]){ 
     try{ 

      Class.forName("oracle.jdbc.OracleDriver"); 

      Connection con = DriverManager.getConnection("jdbc:oracle:thin:@url:port:sid","UserName","Password"); 

      String[] products = { "Product1", "Product2", "Product3" }; 
      String[] models = { "Model1", "Model2", "Model3" }; 
      String[] types = { "Type1", "Type2", "Type3" }; 

      ArrayDescriptor des = ArrayDescriptor.createDescriptor("SYS.ODCIVARCHAR2LIST", con); 

      CallableStatement st = con.prepareCall("call TEST.RQUERY1(?,?,?,?)"); 

      st.setArray(1, new ARRAY(des, con, products)); 
      st.setArray(2, new ARRAY(des, con, models)); 
      st.setArray(3, new ARRAY(des, con, types)); 
      st.registerOutParameter(4, OracleTypes.CURSOR); 
      st.execute(); 
      ResultSet cursor = ((OracleCallableStatement)st).getCursor(4); 

      while (cursor.next()) 
      { 
       int id = cursor.getInt(1); 
       String product = cursor.getString(2); 
       String model = cursor.getString(3); 
       String type = cursor.getString(4); 

       System.out.println(String.format("Id: %5d", id)); 
       System.out.println(String.format(" Product: %s\t", product)); 
       System.out.println(String.format(" Model: %s", model)); 
       System.out.println(String.format(" Type: %s", type)); 
      } 
     } catch(ClassNotFoundException | SQLException e) { 
      System.out.println(e); 
     } 
    } 
} 
+0

很好的解释和很好的替代解决方案。 – SamK