来自参数的Oracle“IN子句”

时间:2011-07-08 19:26:45

标签: oracle parameters in-clause

我对甲骨文非常不熟悉,我只是想让它发挥作用。我看过herehere,但不知道如何让它全部工作。这就是我需要的。我需要一个proc接受一个逗号分隔的字符串作为参数,我可以在查询的“IN子句”中使用它并返回一个游标结果。是否可以在一个包罗万象的过程中做到这一点?如果没有,我需要采取哪些不同的步骤?我再次为我缺乏Oracle知识而道歉,这只是试图让事情快速实现。

由于

这是proc(p_Scope将是逗号分隔的输入):

create or replace PROCEDURE CU_SELECTION_ID
(
p_Scope IN varchar2,
p_ResultSet OUT SYS_REFCURSOR
)
is
BEGIN
OPEN p_ResultSet FOR
select
b.addr1,
b.addr2,
b.city,
b.country_code,
a.customer_no,
b.des1,
a.entity,
b.main_phone_no,
b.phone_area_code,
b.status,
b.wb_site_url,
b.zip
from
ar_customer a,
ct_addr b
where b.main_loc_flag = 'Y' and
a.customer_no = b.customer_no and
a.entity = b.cust_entity and
b.stk_loc_no = '3' and 
b.customer_no in (p_Scope);
END;

4 个答案:

答案 0 :(得分:5)

我相信有一种'更好的方式',但我不确定它现在是什么......

这应该对你有用:

取代:

b.customer_no in (p_Scope);

instr(p_Scope, ','||b.customer_no||',' ) > 0

这将搜索p_Scope并返回值>如果b.customer_no出现在列表中,则为0。

确保列表中的 first和最后一个字符是逗号(',')

(另外,作为Oracle的新来者,我发现Tech Republic是一个非常有用的快速资源。)

答案 1 :(得分:2)

假设声明

create or replace type cvarchar2 as table of varchar2(4000);

查询

select * from some_table t where some_column in 
('FOO','BAR')

给出与

相同的结果
select * from some_table t where some_column in 
(select column_value from table(cvarchar2('FOO','BAR')))

您可以使用第二个并将PLSQL集合传递给表函数。我这样做是从Java ...table(?)完美地工作。与传统的IN条款相比,解释计划似乎并不太糟糕。

基于带分隔符的文本搜索的解决方案可能是性能杀手。

答案 2 :(得分:0)

为了记录,这是另一种丑陋的方式。

   PROCEDURE getreport (
      p_affiliates           IN       varchar2,
      p_StartDate            IN       date,
      p_EndDate              IN       date,
      p_ReturnValue         OUT       sys_refcursor
   ) IS
   BEGIN

        DECLARE
           sql_stmt          VARCHAR2(4000);
        BEGIN

          sql_stmt := 'SELECT
            FIRSTNAME,
            LASTNAME,
            ADDRESSLINE,
            SUITE,
            CITY,
            STATE,
            ZIP
        FROM 
            ORDERHEADER head
            INNER JOIN ORDERDETAIL detail 
                on head.ORDERTRACKINGLOGID = detail.ORDERTRACKINGLOGID
            INNER JOIN ORDERTRACKINGDETAIL trackdetail
                on detail.ORDERDETAILID = trackdetail.ORDERDETAILID 
                    AND head.ORDERHEADERID = trackdetail.ORDERHEADERID
            INNER JOIN AFFILIATE aff
                on trackdetail.AFFILIATEID = aff.AFFILIATEID
        WHERE
            aff.AFFILIATEID IN
            (
                select 
                    AFFILIATEID
                from 
                    AFFILIATE
                where
                    AFFILIATEID IN (' || p_affiliates || ')
            )
            AND
            head.CALENDAR_DATE >= TO_DATE( :p_StartDate )
            AND
            head.CALENDAR_DATE <= TO_DATE( :p_EndDate )    
        ORDER BY AFFILIATEID,
                AFFILIATENAME    
    ';

        OPEN p_ReturnValue for sql_stmt USING p_StartDate, p_EndDate;

        END;

    END getreport;

答案 3 :(得分:0)

你可以这样使用它:

 SELECT * FROM MATABLE 
 WHERE MT_ID 
    IN (SELECT REGEXP_SUBSTR(MYPARAM,'[^,]+', 1, LEVEL) 
        FROM DUAL 
        CONNECT BY REGEXP_SUBSTR(MYPARAM, '[^,]+', 1, LEVEL) IS NOT NULL))

MYPARAM-&#39; 368134,181956&#39;