2015-10-14 64 views
1

我在Oracle 11g中编写了以下内容来分隔IN params(I_PRODUCT)并进行查询。当我给出一个参数作为i_PRODUCT时,它正在填充一些结果。当我插入多个逗号分隔参数时,我期望逐个查询并填充整个结果,并且它不起作用。查询,用逗号分隔PLSQL中的IN参数

create or replace PROCEDURE RQUERY 
(
I_PRODUCT VARCHAR2 
, O_Cursor OUT SYS_REFCURSOR 
) AS BEGIN 
O_Cursor := NULL; 
OPEN O_Cursor for 

SELECT * FROM Table1 WHERE 
Table1.PRODUCT LIKE (select regexp_substr(I_PRODUCT,'[^,]+', 1, level) from dual 
        connect by regexp_substr(I_PRODUCT, '[^,]+', 1, level) is not null); 

END RQUERY ; 

回答

1
SELECT * FROM Table1 WHERE 
Table1.PRODUCT LIKE (select regexp_substr(I_PRODUCT,'[^,]+', 1, level) from dual 
        connect by regexp_substr(I_PRODUCT, '[^,]+', 1, level) is not null); 

LIKE运营商将无法在上面的查询。您需要使用IN,这将在内部评估为多个

Table1.PRODUCT IN (select regexp_substr(I_PRODUCT,'[^,]+', 1, level) from dual 
        connect by regexp_substr(I_PRODUCT, '[^,]+', 1, level) is not null); 

此外,关于varying IN list,看看我的回答here

更新

基于OP的评论。

修改查询为:

WITH str_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  str_search 
      WHERE  tab.col  LIKE pattern 
       ); 
+0

我换成'LIKE' IN'不工作。没有输出。我有PRODUCT列,值为“RETAIL”和“LEASE”。我用来查询的IN参数是''R%,L%'' – SamK

+0

不,它不起作用。在我提供的链接中查看我的答案。改变IN列表不会以这种方式工作。此外,您正在使用LIKE使用逗号分隔值进行野外搜索。不起作用。 –

+0

查看更新。 –

0

使用IN而不是like;

Table1.PRODUCT IN( 
    select regexp_substr(I_PRODUCT,'[^,]+', 1, level) from dual 
    connect by regexp_substr(I_PRODUCT, '[^,]+', 1, level) is not null 
) 
+0

只是改为'按预期 – SamK

1
create or replace PROCEDURE ProcedureName 
(
    I_PRODUCT IN VARCHAR2 :=NULL, 
    O_Cursor OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    DECLARE I_PRODUCT_ VARCHAR2(1000); 
BEGIN 
     I_PRODUCT_ := ',' || nvl(I_PRODUCT,'') || ','; 
     Open O_Cursor FOR 
     SELECT * FROM Table1 WHERE 1=1 
     And (I_PRODUCT_ = ',,' Or I_PRODUCT_ Like '%,' || I_PRODUCT ||',%'); 
    END; 
END ProcedureName; 
+0

我有价值零售和租赁的PRODUCT列。我用来查询的IN参数是'R%,L%'。它可以查询'R%'或'L%'或'R%,L%'。我认为你的代码查询了所有这些,对吧? – SamK