【问题标题】:How to get comma separated values inside Oracle stored procedure如何在 Oracle 存储过程中获取逗号分隔值
【发布时间】:2013-07-22 00:25:26
【问题描述】:

我必须将FlightDateFlightNumbers 作为参数传递给 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') 之类的参数。

【问题讨论】:

  • 您是否尝试过:SELECT * FROM PAX_DETAILS WHERE TO_DATE(FlightDate,'DDMONYY') BETWEEN TO_DATE(FlyingDate,'DDMONYY') AND TO_DATE(FlyingDate,'DDMONYY') + 1 AND FlightNo IN (FlightNumbers )
  • 你试过动态sql吗? :stackoverflow.com/questions/5007725/…
  • @planben - 当动态 SQL 可以在静态 SQL 中完成时,为什么还要使用它?
  • 因为他想在 varchar 参数中接收逗号分隔的 FlightNumbers,所以动态 sql 听起来是个好主意,你不觉得吗?

标签: oracle csv oracle11g oracle-sqldeveloper


【解决方案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);

【讨论】:

  • 善用regexp_count(), 11g 新增。
  • 11g 中的新功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2016-02-07
  • 1970-01-01
  • 2015-04-01
相关资源
最近更新 更多