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 に答える