为什么我的光标只返回顶行?

时间:2012-04-13 21:32:09

标签: oracle

你好我有点困惑我在这个函数中的光标只返回顶行。

我一直把它与我见过的几个不同的例子进行比较,我只是看不出有什么不对。非常感谢任何指导。

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

提前致谢。

2 个答案:

答案 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;

如您所见,没有必要进行循环。