你好我有点困惑我在这个函数中的光标只返回顶行。
我一直把它与我见过的几个不同的例子进行比较,我只是看不出有什么不对。非常感谢任何指导。
FUNCTION FS_A_FUNCTION
(
inDate DATE
)
RETURN VARCHAR2 IS
tAnswer VARCHAR2(1) := 'N';
tDates DATE;
CURSOR c1 IS
SELECT S.Dates FROM A_TABLE S;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO tDates;
EXIT WHEN c1%NOTFOUND;
END LOOP;
CLOSE c1;
IF inDate IN (tDates) THEN
tAnswer := 'Y';
END IF;
RETURN (tAnswer);
END FS_A_FUNCTION
提前致谢。
答案 0 :(得分:4)
不太确定你期待发生什么。在循环tDates
之后,光标看到的最后一行中只有一个值。由于您的select
没有order by
,因此可能是您表中的任何值。我想你可能想要在循环中检查inDate
的值。
我不确定你为什么要使用光标,除非真正的逻辑更复杂。如果你按照我的想法行事,你可以做一些像:
FUNCTION FS_A_FUNCTION
(
inDate DATE
)
RETURN VARCHAR2 IS
tAnswer VARCHAR2(1);
BEGIN
select decode(max(dates), null, 'N', 'Y')
into tAnswer
from a_table
where dates = inDate;
RETURN tAnswer;
END FS_A_FUNCTION;
......或者说同一个逻辑可能更清楚一点:
FUNCTION FS_A_FUNCTION
(
inDate DATE
)
RETURN VARCHAR2 IS
tDates DATE;
BEGIN
select max(dates)
into tDates
from a_table
where dates = inDate;
IF tDates IS NULL THEN
RETURN 'N';
ELSE
RETURN 'Y';
END IF;
END FS_A_FUNCTION;
在这两种情况下,我都使用max()
,以防有多个行具有相同的日期。
答案 1 :(得分:2)
您正在测试表中inDate
字段中是否存在dates
,但仅在循环结束后,因此对tDates
的引用将是查询的最后一条记录
您可以通过简单地检查是否存在包含日期的记录来执行此操作:
cursor c1 is
select *
from A_TABLE
where Dates = inDate;
如您所见,没有必要进行循环。