返回PLSQL游标

时间:2015-10-14 08:34:51

标签: sql oracle plsql

我有一张包含日程安排信息的表格。根据具体情况,我可能希望选择驾驶序列的所有计划信息,或者我可能希望根据开始和结束日期进行选择。这是一个非常通用的事情。

然后我有一个需要所述时间表信息的函数,但方法内部的某些内容将决定是否需要开始日期。

所以我想要这样的事情:

    getCursor(serial, startdate, enddate)

在我的功能中:

    if something or other:
      cursor = getCursor(serial, null, null)
    else
      cursor = getCursor(serial, start, null)

    Loop around cursor

有关如何获得此行为的任何想法?我环顾四周,看到了各种不同的方法,但却无法让它们起作用。我想在PL / SQL中做正确的方法吗?这不是我经常使用的语言......

2 个答案:

答案 0 :(得分:3)

对我来说,你需要IF语句或任何递归都不是很明显。听起来你只是想要

CREATE OR REPLACE FUNCTION getSchedule( p_serial IN table_name.serial%type,
                                        p_start_date IN DATE DEFAULT NULL,
                                        p_end_date IN DATE DEFAULT NULL )
  RETURN sys_refcursor
IS
  l_schedule_rc sys_refcursor;
BEGIN
  OPEN l_schedule_rc
   FOR SELECT *
         FROM table_name
        WHERE serial = p_serial
          AND (p_start_date IS NULL or start_date >= p_start_date)
          AND (p_end_date IS NULL   or end_date   <= p_end_date);
  RETURN l_schedule_rc;
END;

这允许开始日期和结束日期为可选参数,如果输入的参数为NULL或省略,则查询将忽略日期。当然,这假设您有一个调用程序,它知道如何调用返回sys_refcursor的PL / SQL函数...

答案 1 :(得分:0)

看起来您不需要为您发出特殊功能。 试试这个:

-- Retruns all rows that start_date is between p_from and p_to
SELECT *
  FROM table_name t
 WHERE t.serial = p_serial
   AND t.start_date BETWEEN NVL(p_from, t.start_date) 
                        AND NVL(p_to  , t.start_date)