我有一张包含日程安排信息的表格。根据具体情况,我可能希望选择驾驶序列的所有计划信息,或者我可能希望根据开始和结束日期进行选择。这是一个非常通用的事情。
然后我有一个需要所述时间表信息的函数,但方法内部的某些内容将决定是否需要开始日期。
所以我想要这样的事情:
getCursor(serial, startdate, enddate)
在我的功能中:
if something or other:
cursor = getCursor(serial, null, null)
else
cursor = getCursor(serial, start, null)
Loop around cursor
有关如何获得此行为的任何想法?我环顾四周,看到了各种不同的方法,但却无法让它们起作用。我想在PL / SQL中做正确的方法吗?这不是我经常使用的语言......
答案 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)