2013-05-01 73 views
0

我試圖調試下面的代碼。我得到PLS-00103兩次。一旦在26行,並在35行一次。我已經試過註釋周圍的提升沒有數據發現異常和raise語句本身的if語句。我真的不知道我要去哪裏錯了。任何幫助將不勝感激。PLS-00103:遇到符號「;」當期待以下之一

CREATE OR REPLACE PROCEDURE viewingPercentageDif 
    (episodeKeyA IN NUMBER, episodeKeyB IN NUMBER) 
    IS 
episodeOrderException EXCEPTION; 
notConsecutiveException EXCEPTION; 

preceedingEpisode NUMBER := 0; 
subsequentEpisode NUMBER := 0; 
percetageChange NUMBER :=0; 

CURSOR episodeCursorA IS SELECT episode.ep_view_figures FROM episode WHERE episode.ep_suragate_pk = episodeKeyA; 
CURSOR episodeCursorB IS SELECT episode.ep_view_figures FROM episode WHERE episode.ep_suragate_pk = episodeKeyB; 

BEGIN 

IF (episodeKeyA > episodeKeyB) THEN 
    RAISE episodeOrderException; 
END IF; 

BEGIN 
    OPEN episodeCursorA; 
    FETCH episodeCursorA INTO preceedingEpisode; 
    IF episodeCursorA%NOTFOUND THEN 
     RAISE NO_DATA_FOUND; 
    END IF; 
    CLOSE;-- line 26 
END; 

BEGIN 
    OPEN episodeCursorB; 
    FETCH episodeCursorB INTO preceedingEpisode; 
    IF episodeCursorA%NOTFOUND THEN 
     RAISE NO_DATA_FOUND; 
    END IF; 
    CLOSE;-- line 35 
END; 

-- this algorythm should be used for consective episodes only 
-- need last and first episodes also 
IF ((episodeKeyA + 1) = episodeKeyB) THEN 
    -- check if preceeding episode viewing figure is > or < subsequent episode 
    -- if preceeding episode < subequent then there has been an decrease 
    IF preceedingEpisode < subsequentEpisode THEN 
     percentageChange := subsequentEpisode - preceedingEpisode; 
     percentageChange := (percentageChange/subsequentEpisode) * 100; 

      DBMS_OUTPUT.PUT_LINE('Viewing figures have decreased by: ' || percentageChange || '%'); 

     -- check for increase 
    ELSIF preceedingEpisode > subsequentEpisode THEN 
      percentageChange := preceedingEpisode - subsequentEpisode; 
      percentageChange := (percetageChange/subsequentEpisode) * 100; 

      DBMS_OUTPUT.PUT_LINE('Viewing figures have increased by: ' || percentageChange || '%'); 
    END IF; 
ELSE 
RAISE notConsecutiveException; 
END IF; 

    EXCEPTION 
    WHEN notConsecutiveException THEN 
DBMS_OUTPUT.PUT_LINE('These episodes are not consecutive'); 
    WHEN NO_DATA_FOUND THEN 
DBMS_OUTPUT.PUT_LINE('NO DATA FOUND'); 
    WHEN OTHERS THEN 
RAISE_APPLICATION_ERROR(-20003, 'AN ERROR WAS ENCOUNTERED'); 

    END viewingPercentageDif; 
    /

回答

4

你對你關閉命令缺少光標名稱:

BEGIN 
    OPEN episodeCursorB; 
    FETCH episodeCursorB INTO preceedingEpisode; 
    IF episodeCursorA%NOTFOUND THEN 
     RAISE NO_DATA_FOUND; 
    END IF; 
    CLOSE;-- line 35 
END; 

應該是:

BEGIN 
    OPEN episodeCursorB; 
    FETCH episodeCursorB INTO preceedingEpisode; 
    IF episodeCursorA%NOTFOUND THEN 
     RAISE NO_DATA_FOUND; 
    END IF; 
    CLOSE episodeCursorB; 
END; 

同爲其他光標。否則,甲骨文如何知道你所指的什麼光標關閉?

看到這個鏈接的細節 - Close Cursor Syntax

+0

非常感謝! – user1763170 2013-05-01 16:55:36

+0

@ user1763170 - 在StackOverflow的這裏,認爲禮貌接受一個答案,它爲您的問題提供瞭解決方案。爲此,請回答問題(哦,您已經在這裏),並且在答案總數的下方,您會注意到一個略有勾劃的複選標記。如果您在該複選標記內點擊,它將變成綠色,表示答案已被接受。如果你這樣做,回答得到15個聲望點的人。我們這些回答很多問題的人*會*注意是否有人接受答案。分享並享受。 – 2013-05-01 17:28:55

+0

對不起,現在我會回顧其他我問過的問題,以確保人們得到正確的認可。 – user1763170 2013-05-01 18:30:21

相關問題