0

FlightDate以下のように、FlightNumbersパラメータとして Oracle ストアド プロシージャに渡す必要があります。

CREATE OR REPLACE PROCEDURE GetPaxDetails(
   FlyingDate IN PAX_DETAILS.FlightDate%TYPE, 
   FlightNumbers IN VARCHAR(300))
IS
BEGIN
    -- Assume that we've received **FlightNumbers** as '0620,0712,0154'
    -- Basically I am trying to select all passenger details (PAX_DETAILS) 
    -- for those flights passed in as a parameter(**FlightNumbers**) 
    -- for the specified dates
    -- In this procedure the query should be generated something like below:
    SELECT * 
      FROM PAX_DETAILS 
     WHERE TO_DATE(FlightDate,'DDMONYY') BETWEEN TO_DATE(FlyingDate,'DDMONYY') 
                                             AND TO_DATE(FlyingDate,'DDMONYY') + 1 
       AND FlightNo IN ('0620,0712,0154')

END

FlightNumbersパラメータをAND FlightNo IN ('0620,0712,0154')クエリ内のようなものに変換する方法がわかりません。

4

1 に答える 1

4

アプローチの 1 つとして、regexp_substr()およびregexp_count()正規表現関数を使用してソース文字列をテーブルの行に分割し、その結果をIN句に簡単に含めることができます。

-- splitting a comma separated string
select regexp_substr(FlightNumbers, '[^,]+', 1, level) as num
  from dual
connect by level <= regexp_count(FlightNumbers, '[^,]+')

たとえば、FlightNumbers「0620,0712,0154」として渡すと、上記のクエリは次の結果を生成します。

NUM
--------
0620
0712
0154

それが手元にあると、最終的なクエリは次のようになります。

with numbers(num) as(
   select regexp_substr(FlightNumbers, '[^,]+', 1, level) as num
     from dual
  connect by level <= regexp_count(FlightNumbers , '[^,]+')
 )
SELECT *           -- do not forget INTO clause
  FROM PAX_DETAILS 
 WHERE TO_DATE(FlightDate,'DDMONYY') BETWEEN TO_DATE(FlyingDate,'DDMONYY') 
                                         AND TO_DATE(FlyingDate,'DDMONYY') + 1 
   AND FlightNo IN (select num
                      from numbers);
于 2013-07-23T05:34:47.830 に答える