1

私は奇妙な問題に直面しています。それは私に示しています:

行 28 のエラー: PLS-00103: 次のいずれかを予期しているときに、シンボル「ファイルの終わり」が発生しました:

コードは以下のとおりです。

CREATE OR REPLACE FUNCTION st_atten_up(stu_id IN student_info.id%type,app_mon IN student_attendence.month%type)
RETURN NUMBER
    IS
        PRAGMA AUTONOMOUS_TRANSACTION;
        att1 NUMBER; 
        CURSOR c1(sid IN student_info.id%type, pmon IN student_attendence.month%type) IS
        SELECT ATTENDANCE
        FROM STUDENT_ATTENDENCE
        WHERE id = sid and month = pmon;

    -- You may want a smaller variable if you know the result will be smaller
    BEGIN
        open c1;
        fetch c1(stu_id,app_mon) into att1;
        c1;

        att1 :=att1 + 1;
        UPDATE STUDENT_ATTENDENCE
        SET STUDENT_ATTENDENCE.ATTENDANCE = att1
        where STUDENT_ATTENDENCE.ID = stu_id and STUDENT_ATTENDENCE.month = app_mon;
        COMMIT;
        return att1;

        EXCEPTION
        WHEN OTHERS THEN
            ROLLBACK;
            raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
    END;

ここで何が悪いのかわかりません。

4

2 に答える 2

0

問題は、c1;おそらくclose c1;. 少し異なる解決策を提案します。つまり、スタンドアロン カーソルの代わりにカーソル FOR ループを使用し、1 回の反復後にループを終了します。これにより、データがフェッチされていないことを確認する必要が完全になくなり(オリジナルでは行われませんでした)、IMO によりコードが読みやすく、理解しやすくなります。

CREATE OR REPLACE FUNCTION st_atten_up(stu_id IN student_info.id%type,
                                       app_mon IN student_attendence.month%type)
  RETURN NUMBER
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  FOR aRow IN (SELECT ID, MONTH, ATTENDANCE
                 FROM STUDENT_ATTENDENCE
                 WHERE ID = stu_id AND
                       MONTH = app_mon)
  LOOP
    aRow.ATTENDANCE := aRow.ATTENDANCE + 1;

    UPDATE STUDENT_ATTENDENCE
      SET ATTENDANCE = aRow.ATTENDANCE
      WHERE ID = aRow.ID and
            MONTH = aRow.MONTH;
    COMMIT;

    RETURN aRow.STUDENT_ATTENDANCE;
  END LOOP;

  RETURN NULL;  -- no data found in FOR loop
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Exception: ' || SQLCODE || '  ' || SQLERRM);
    ROLLBACK;
    raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END ST_ATTEN_UP;

共有してお楽しみください。

于 2013-07-26T21:02:27.040 に答える