2015-10-14 65 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