0

Oracle 12.1 のストアド プロシージャに問題があります。

打撃コードでエラーが発生していますが、2 つの EXCEPTION ステートメントを続けて使用していると思われますか?

私は、レンタル キュー テーブルのキューの位置を更新する偽の小さなオンライン DVD 会社のストアド プロシージャを作成しました。メンバーがこの DVD をキューに既に持っているかどうかを示す IF ステートメントを使用し、キューの位置を更新します。メンバーが既にキューに DVD を持っているかどうかを確認するために、メンバー キューに DVD があるかどうかを確認する SQL Select ステートメントを記述します。ステートメントが DVD を検出すると、それを "dvd_check" に挿入します。DVD が見つからない場合は、DVD_check を 0 に設定します。

また、更新しようとしている行の元のキューの順序を決定する 2 番目の SQL ステートメントもあります。両方のステートメントは、ストアド プロシージャ内で単独でうまく動作しますが、IF ステートメントの前に StoredProcedure でそれらをまとめると、エラーが発生します。

エラー(17,5): PLS-00103: 次のいずれかを予期しているときに、シンボル「EXCEPTION」が発生しました: ( begin case declare end exit for goto if loop mod null... AND

エラー(29,4): PLS-00103: 次のいずれかを予期しているときに、記号「ファイルの終わり」が検出されました: end not pragma final instanceiable order オーバーライド static...

ここに私のコードがあります:

CREATE OR REPLACE PROCEDURE sp_queueorder (
dvdid_sp number,
memberid_sp number,
queueposition_sp number)
IS
dvd_check number;
old_queueposition number;
BEGIN

SELECT dvdid INTO dvd_check FROM rentalqueue  
WHERE DVDid = dvdid_sp and memberid = memberid_sp;
EXCEPTION
WHEN no_data_found THEN dvd_check := 0;

SELECT queueposition INTO old_queueposition FROM rentalqueue  
WHERE DVDid = dvdid_sp and memberid = memberid_sp;
EXCEPTION
WHEN no_data_found THEN old_queueposition := 0;

IF dvd_check > 0 THEN

UPDATE rentalqueue SET queueposition = queueposition + 1
WHERE memberid = memberid_sp and queueposition >= queueposition_sp AND queueposition <=       old_queueposition;

UPDATE rentalqueue SET queueposition = queueposition_sp
WHERE dvdid = dvdid_sp AND memberid = memberid_sp;

END IF;
END;

この問題を解決するのを手伝ってくれてありがとう。

4

3 に答える 3

0
CREATE OR REPLACE PROCEDURE sp_queueorder (
    dvdid_sp number,
    memberid_sp number,
    queueposition_sp number)
IS
    dvd_check number;
    old_queueposition number;
BEGIN
    -- 1st select
    BEGIN
        SELECT dvdid INTO dvd_check FROM rentalqueue  
        WHERE DVDid = dvdid_sp and memberid = memberid_sp;
    EXCEPTION
        WHEN no_data_found THEN dvd_check := 0;
    END;

    -- 2nd select
    BEGIN
        SELECT queueposition INTO old_queueposition FROM rentalqueue  
        WHERE DVDid = dvdid_sp and memberid = memberid_sp;
    EXCEPTION
        WHEN no_data_found THEN old_queueposition := 0;
    END;

    IF dvd_check > 0 THEN
        UPDATE rentalqueue SET queueposition = queueposition + 1
        WHERE memberid = memberid_sp and queueposition >= queueposition_sp AND queueposition <= old_queueposition;

        UPDATE rentalqueue SET queueposition = queueposition_sp
        WHERE dvdid = dvdid_sp AND memberid = memberid_sp;

        COMMIT; -- if is not needed remove
    END IF;
END;
于 2013-11-12T14:03:44.513 に答える
0

END がありません。あなたのコードで。制御の流れに応じて、次のようになります。

CREATE OR REPLACE PROCEDURE sp_queueorder (
dvdid_sp number,
memberid_sp number,
queueposition_sp number)
IS
dvd_check number;
old_queueposition number;
BEGIN

SELECT dvdid INTO dvd_check FROM rentalqueue  
WHERE DVDid = dvdid_sp and memberid = memberid_sp;
EXCEPTION
WHEN no_data_found THEN dvd_check := 0;
---add an END; to the block here?
END;
SELECT queueposition INTO old_queueposition FROM rentalqueue  
WHERE DVDid = dvdid_sp and memberid = memberid_sp;
EXCEPTION
WHEN no_data_found THEN old_queueposition := 0;
----or add an end here?
END;
IF dvd_check > 0 THEN

UPDATE rentalqueue SET queueposition = queueposition + 1
WHERE memberid = memberid_sp and queueposition >= queueposition_sp AND queueposition <=       old_queueposition;

UPDATE rentalqueue SET queueposition = queueposition_sp
WHERE dvdid = dvdid_sp AND memberid = memberid_sp;

END IF;
END;
--or add it here?
END;
于 2013-11-12T13:33:17.300 に答える
0

コードの途中で例外があります。次のようにコードを構成する必要があります。

begin
   begin
     select ...
   exception
     when no_data_found ..
   end;

   begin
     select ...
   exception
     when no_data_found ..
   end;
   ...
end;
于 2013-11-12T13:56:57.390 に答える