2013-05-01 76 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

相关问题