2

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

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

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

提前致谢。

4

2 回答 2

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()以防多行具有相同的日期。

于 2012-04-13T21:40:31.557 回答
2

您正在测试表inDate的字段中是否存在dates,但仅在循环结束后,因此引用tDates将是查询的最后一条记录。

您可以通过简单地检查是否存在带有日期的记录来做到这一点:

cursor c1 is
  select *
    from A_TABLE
   where Dates = inDate;

如您所见,无需循环。

于 2012-04-13T21:41:05.190 回答