返回PLSQL游标

返回PLSQL游标,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个包含日程信息的表格。根据情况,我可能希望选择驾驶序列的所有计划信息,或者我可能希望根据开始和结束日期进行选择。这是一件非常普通的事情 然后,我有一个函数,它需要所说的日程信息,但方法中的某些内容将决定是否需要开始日期 所以我想要这样的东西: getCursor(serial, startdate, enddate) 在我的职能范围内: if something or other: cursor = getCursor(serial, null, null)

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

然后,我有一个函数,它需要所说的日程信息,但方法中的某些内容将决定是否需要开始日期

所以我想要这样的东西:

    getCursor(serial, startdate, enddate)
在我的职能范围内:

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

    Loop around cursor

你知道怎么做吗?我环顾四周,看到了各种不同的方法,但都没有成功。在PL/SQL中,我想做的是正确的方法吗?这不是我经常使用的语言…

我不清楚您是否需要
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;
创建或替换函数getSchedule(表中的p_serial_name.serial%类型,
p_开始日期默认为空,
p_结束日期(日期默认为空)
返回系统参考光标
是
l\u进度表\u rc系统\u参考光标;
开始
打开l_明细表
选择*
从表\u名称
其中serial=p_serial
和(p_开始日期为空或开始日期>=p_开始日期)

(p_end_date为NULL或end_date我不清楚您是否需要
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;
创建或替换函数getSchedule(表中的p_serial_name.serial%类型,
p_开始日期默认为空,
p_结束日期(日期默认为空)
返回系统参考光标
是
l\u进度表\u rc系统\u参考光标;
开始
打开l_明细表
选择*
从表\u名称
其中serial=p_serial
和(p_开始日期为空或开始日期>=p_开始日期)

(p_end_date为NULL或end_date我不清楚您是否需要
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;
创建或替换函数getSchedule(表中的p_serial_name.serial%类型,
p_开始日期默认为空,
p_结束日期(日期默认为空)
返回系统参考光标
是
l\u进度表\u rc系统\u参考光标;
开始
打开l_明细表
选择*
从表\u名称
其中serial=p_serial
和(p_开始日期为空或开始日期>=p_开始日期)

(p_end_date为NULL或end_date我不清楚您是否需要
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;
创建或替换函数getSchedule(表中的p_serial_name.serial%类型,
p_开始日期默认为空,
p_结束日期(日期默认为空)
返回系统参考光标
是
l\u进度表\u rc系统\u参考光标;
开始
打开l_明细表
选择*
从表\u名称
其中serial=p_serial
和(p_开始日期为空或开始日期>=p_开始日期)

(p_end_date为空或end_date看起来您不需要为您的问题提供特殊功能。 试试这个:

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

看起来您不需要为您的问题提供特殊功能。 试试这个:

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

看起来您不需要为您的问题提供特殊功能。 试试这个:

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

看起来您不需要为您的问题提供特殊功能。 试试这个:

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

这看起来与我以前看到的类似。我的调用程序希望根据返回的行进行计算。返回的行将取决于是否需要开始日期。考虑到这一点,实际上不需要IF语句。我只是传入startdate,它处理为null。这与我以前看到的类似ore.我的调用程序想根据返回的行进行计算。返回的行取决于是否需要开始日期。想想看,IF语句实际上并不需要。我只传入startdate,它处理为null的问题。这看起来与我以前看到的类似。我的调用程序想在o根据返回的行进行计算。返回的行将取决于是否需要开始日期。考虑到这一点,IF语句实际上并不需要。我只是传入startdate,它将处理为null。这与我以前看到的类似。我的调用程序希望根据返回的行进行计算返回的行将取决于是否需要开始日期。考虑一下,IF语句并不是真正需要的。我只是传入startdate,它处理为null。