2013-07-23 4 views
0

Je dois passer FlightDate, FlightNumbers comme paramètres de la procédure Oracle stockée comme ci-dessous.Comment obtenir des valeurs séparées par des virgules dans la procédure stockée 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 

je ne comprends pas comment convertir le paramètre FlightNumbers à quelque chose comme AND FlightNo IN ('0620,0712,0154') dans la requête.

+0

Avez-vous essayé: SELECT * FROM PAX_DETAILS OÙ TO_DATE (FlightDate, 'DDMONYY') ENTRE TO_DATE (FlyingDate, 'DDMONYY') ET TO_DATE (FlyingDate, 'DDMONYY') + 1 ET FlightNo IN (FlightNumbers) – Satya

+0

avez-vous essayé d'utiliser SQL dynamique? : http://stackoverflow.com/questions/5007725/pl-sql-using-a-dynamic-query-inside-a-stored-procedure – planben

+0

Vous pourriez trouver votre réponse: [Envoi d'un tableau de valeurs à la procédure Oracle à utiliser dans la clause WHERE IN] (http://stackoverflow.com/questions/13580245/sending-an-array-of-values-to-oracle-procedure-to-use-in-where-in-clause) –

Répondre

4

Comme l'une des approches, les regexp_substr() et regexp_count() fonctions d'expressions régulières peuvent être utilisées pour diviser la chaîne source en lignes de table et vous pouvez facilement inclure ce résultat dans votre article IN:

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

Ainsi, par exemple, si vous passez FlightNumbers comme « 0620,0712,0154 », la requête ci-dessus produira le résultat suivant:

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

Ayant ce à portée de main, votre woul de requête finale d être:

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

Bon usage de 'regexp_count()', nouveau dans 11g. – APC

+0

Un pour nouvelle fonctionnalité dans 11g –

Questions connexes