Query with comma seperated IN parameters in PLSQL

巧了我就是萌 提交于 2019-12-11 13:34:38

问题


I wrote the following in Oracle 11g to separate IN params (I_PRODUCT)and make a query. When I give one parameter as the i_PRODUCT, it is populating some results. When I am inserting multiple comma separated parameters, I am expecting to query one by one and populate the entire result and it is not working.

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

The LIKE operator would fail in above query. You need to use IN, which would internally be evaluated as multiple OR.

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

Also, regarding varying IN list, have a look at my answer here.

Update

Based on OP's comments.

Modify the query as:

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



回答2:


 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;



回答3:


use IN instead of like;

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


来源:https://stackoverflow.com/questions/33126779/query-with-comma-seperated-in-parameters-in-plsql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!