0

私はこのOracleの手順を持っています:

CREATE OR REPLACE PROCEDURE xmas
IS
    CURSOR curUser IS SELECT userID, coins FROM Users;
    thisUser curUser%ROWTYPE;
    d VARCHAR(7);
    CURSOR curDate IS SELECT TO_CHAR(sysdate, 'DD-MON') FROM DUAL;
BEGIN
    OPEN curDate;
    FETCH curDate INTO d;
    CLOSE curDate;
    IF ((TO_DATE(d)) = (TO_DATE('25-DEC'))) THEN
        OPEN curUser;
        LOOP
            FETCH curUser INTO thisUser;
            EXIT WHEN (curUser%NOTFOUND);
            thisUser.coins := thisUser.coins + 5.00;
            UPDATE Users SET coins = thisUser.coins WHERE userID = thisUser.userID;
        END LOOP;
        CLOSE curUser;
    END IF;
END xmas;

そしてそれを呼び出すと、次のエラーが発生します。

ORA-01840: 入力値が日付フォーマットに対して十分な長さではありません。

さまざまな比較方法を何時間も試しましたが、他に何もうまくいきませんでした。どうしたの??

4

1 に答える 1

2

Oracle が実際に「25-DEC」を意味することを知るには、日付形式を指定する必要があります。

select TO_DATE('25-DEC', 'DD-MON') from dual;

問題は次の行にあります。

    IF ((TO_DATE(d)) = (TO_DATE('25-DEC'))) THEN

注意として、あなたも多くの不要な変換を行っているようです。これが教育的な試みであるかどうかはわかりませんが、以下の更新を実行してみませんか。

update USERS 
set
  coins = coins + 5
where
  to_char(sysdate, 'DD-MON') = '25-DEC';
于 2012-05-11T12:09:00.107 に答える