6

私はOracleにあまり詳しくなく、これを機能させようとしています。私はここここを見てきましたが、それをすべて機能させる方法がわかりません。これが私が必要なものです。クエリの「IN句」で使用してカーソル結果を返すことができるパラメータとしてコンマ区切りの文字列を受け入れるprocが必要です。これを1つの包括的な手順で行う方法はありますか?そうでない場合、私が取る必要があるさまざまなステップは何ですか?繰り返しになりますが、オラクルについての知識が不足していることをお詫びします。これは、何かを実際に迅速に機能させることを目的としているだけです。

ありがとう

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

4 に答える 4

9

「より良い方法」があると思いますが、今は何なのかわかりません...

これはあなたのために働くはずです:

交換:

b.customer_no in (p_Scope);

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

これにより、p_Scopeが検索され、b.customer_noがリストに表示されている場合は>0の値が返されます。

リストの最初と最後の文字がコンマ('、')であることを確認してください

(また、Oracleの新参者として、Tech Republicが非常に役立つクイックリソースであることがわかりました。)

于 2011-07-08T20:00:56.390 に答える
3

宣言を想定

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

2番目のものを使用して、PLSQLコレクションを表関数に渡すことができます。私はこれを、...table(?)完全に機能するJavaからこのように行います。Explainプランは、従来のIN句と比較してそれほど悪くはないようです。

区切り文字を使用したテキスト検索に基づくソリューションは、パフォーマンスを低下させる可能性があります。

于 2012-11-12T15:05:11.530 に答える
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;
于 2011-07-08T20:30:53.057 に答える
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-「368134,181956」

于 2015-12-30T11:23:12.863 に答える