【问题标题】:PLS-00103: Encountered the symbol ";" when expecting one of the followingPLS-00103:遇到符号“;”当期待以下之一时
【发布时间】:2013-05-02 00:50:23
【问题描述】:

我正在尝试调试以下代码。我得到了 PLS-00103 两次。一次在第 26 行,一次在第 35 行。我尝试注释掉围绕 raise no data found 异常的 if 语句和 raise 语句本身。我真的看不出我哪里错了。任何帮助将不胜感激。

   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;
    /

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您的关闭命令中缺少光标名称:

    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; 
    

    其他光标也一样。否则,Oracle 怎么知道你要关闭的游标是什么?

    查看此链接了解详情 - Close Cursor Syntax

    【讨论】:

    • @user1763170 - 在 StackOverflow 上,接受为您的问题提供解决方案的答案被认为是礼貌的。为此,请转到问题(哦,您已经在这里),在答案的投票总数下方,您会注意到一个带轮廓的小勾号。如果您在此复选标记内单击,它将变为绿色,表示答案已被接受。如果您这样做,回答的人将获得 15 点声望。我们这些回答很多问题的人确实会注意某人是否接受答案。分享和享受。
    • 抱歉,现在完成,我将检查我提出的其他问题,以确保人们得到正确的承认。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2021-09-19
    • 2014-09-18
    相关资源
    最近更新 更多