PLS错误:00103遇到符号“EXCEPTION”

时间:2017-11-08 14:14:28

标签: oracle stored-procedures plsql oracle11g

所以,我创建了以下程序:

--First Stored Procedure--
CREATE OR REPLACE PROCEDURE sp_GetMileageBalance (StartMileage IN NUMBER,EndMileage IN NUMBER, ExpDate IN DATE)
IS  --Code declaration section--
    --variables to store column values returned from select into
     fPassengerID        VARCHAR2(10);
     pFirst              VARCHAR2(20);
     pLast               VARCHAR2(20);
     fFreqflyernum       NUMBER (10);
     fFreqflyerMileage   NUMBER (7);
     fMileagebalance     NUMBER (7);
     fMileageExpDate     DATE;
     MileageExpDate      DATE;
     MileageStart        NUMBER (7);
     MileageEnd          NUMBER (7);
     MileageBalance      NUMBER (7);

     --Declare Cursor
              CURSOR cur_FreqFlyer IS
     --Query cursor will point to results         
SELECT F.FPASSENGERID, P.First, P.Last, F.FREQFLYERNUM, F.FREQFLYERMILEAGE, F.MILEAGEBALANCE, F.MILEAGEEXPDATE
INTO  fPassengerID, pFirst,pLast,fFreqflyernum,fFreqflyerMileage,fMileagebalance,fMileageExpDate
FROM FREQUENT_FLYER F
INNER JOIN PASSENGER P
ON F.FPassengerID = P.PassengerID
WHERE F.MileageBalance >= StartMileage AND F.MILEAGEBALANCE <= EndMileage
AND MileageExpDate > ExpDate;


    --Start Execution section--
BEGIN 
     --Open Cursor
     OPEN cur_FreqFlyer; --  open cursor for use   
     --loop to display each record returned by cursor 
     --Use PL/SQL language control or loop to display each record pointed by cursor 
   LOOP
        --Fetch cursor data
        FETCH cur_FreqFlyer INTO fPassengerID,pFirst,pLast,fFreqflyernum,fFreqflyerMileage,
        fMileageBalance,fMileageExpDate;
        EXIT WHEN cur_FreqFlyer%NOTFOUND;
        --Display each record
        --Displaying the results


DBMS_OUTPUT.PUT_LINE ('CUSTOMER INFORMATION: ');
DBMS_OUTPUT.PUT_LINE (' ');
DBMS_OUTPUT.PUT_LINE ('The Frequent Flyer PassengerID is:  ' ||fPassengerID);
DBMS_OUTPUT.PUT_LINE ('First Name of passenger is:  ' ||pFirst);
DBMS_OUTPUT.PUT_LINE ('Last Name of passenger is:  ' ||pLast);
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer number of passenger is: ' ||fFreqflyernum);
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer Mileage of Passenger is:  ' ||fFreqflyerMileage);
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer Balance of passenger is:  ' ||fMileageBalance );
DBMS_OUTPUT.PUT_LINE ('Mileage expiration date of passenger is:  ' ||fMileageExpDate);
DBMS_OUTPUT.PUT_LINE (' ');

END LOOP;

        CLOSE cur_FreqFlyer; --close cursor

        END sp_GetMileageBalance;

当我跑步时,它按预期工作。当我运行存储过程时:

SET SERVEROUTPUT ON

        EXECUTE sp_GetMileageBalance (10000,20000,'01-OCT-17');

我得到了我的结果:

CUSTOMER INFORMATION: 

The Frequent Flyer PassengerID is:  KL87DF34DS
First Name of passenger is:  Michelle
Last Name of passenger is:  Mullington
Frequent Flyer number of passenger is: 9374392018
Frequent Flyer Mileage of Passenger is:  400
Frequent Flyer Balance of passenger is:  15000
Mileage expiration date of passenger is:  19-DEC-20

>PL/SQL procedure successfully completed.

然而,当我试图提出异常时:

EXCEPTION
    WHEN no_data_found THEN
     -- do something
     dbms_output.put_line('Results not found.Try again ');

它给了我这个错误:

LINE / COL ERROR

54/2 PLS-00103:当遇到以下情况之一时遇到符号“EXCEPTION”:          (如果循环mod为null,则开始为goto声明结束退出          用pragma提高返回选择更新            &LT;&LT;          继续关闭当前删除获取锁定插入打开回滚          savepoint set sql execute commit forall merge pipe purge

62/5 PLS-00103:遇到以下其中一项时遇到符号“CLOSE”:          结束不是pragma最终可实例化的命令覆盖静态          成员构造函数映射

不知道为什么它会把这种情绪反馈给我。

这就是我把它放在我的代码中的方式:

--First Stored Procedure--
CREATE OR REPLACE PROCEDURE sp_GetMileageBalance (StartMileage IN NUMBER,EndMileage IN NUMBER, ExpDate IN DATE)
IS  --Code declaration section--
    --variables to store column values returned from select into
     fPassengerID        VARCHAR2(10);
     pFirst              VARCHAR2(20);
     pLast               VARCHAR2(20);
     fFreqflyernum       NUMBER (10);
     fFreqflyerMileage   NUMBER (7);
     fMileagebalance     NUMBER (7);
     fMileageExpDate     DATE;
     MileageExpDate      DATE;
     MileageStart        NUMBER (7);
     MileageEnd          NUMBER (7);
     MileageBalance      NUMBER (7);

     --Declare Cursor
              CURSOR cur_FreqFlyer IS
     --Query cursor will point to results         
SELECT F.FPASSENGERID, P.First, P.Last, F.FREQFLYERNUM, F.FREQFLYERMILEAGE, F.MILEAGEBALANCE, F.MILEAGEEXPDATE
INTO  fPassengerID, pFirst,pLast,fFreqflyernum,fFreqflyerMileage,fMileagebalance,fMileageExpDate
FROM FREQUENT_FLYER F
INNER JOIN PASSENGER P
ON F.FPassengerID = P.PassengerID
WHERE F.MileageBalance >= StartMileage AND F.MILEAGEBALANCE <= EndMileage
AND MileageExpDate > ExpDate;


    --Start Execution section--
BEGIN 
     --Open Cursor
     OPEN cur_FreqFlyer; --  open cursor for use   
     --loop to display each record returned by cursor 
     --Use PL/SQL language control or loop to display each record pointed by cursor 
   LOOP
        --Fetch cursor data
        FETCH cur_FreqFlyer INTO fPassengerID,pFirst,pLast,fFreqflyernum,fFreqflyerMileage,
        fMileageBalance,fMileageExpDate;
        EXIT WHEN cur_FreqFlyer%NOTFOUND;
        --Display each record
        --Displaying the results


DBMS_OUTPUT.PUT_LINE ('CUSTOMER INFORMATION: ');
DBMS_OUTPUT.PUT_LINE (' ');
DBMS_OUTPUT.PUT_LINE ('The Frequent Flyer PassengerID is:  ' ||fPassengerID);
DBMS_OUTPUT.PUT_LINE ('First Name of passenger is:  ' ||pFirst);
DBMS_OUTPUT.PUT_LINE ('Last Name of passenger is:  ' ||pLast);
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer number of passenger is: ' ||fFreqflyernum);
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer Mileage of Passenger is:  ' ||fFreqflyerMileage);
DBMS_OUTPUT.PUT_LINE ('Frequent Flyer Balance of passenger is:  ' ||fMileageBalance );
DBMS_OUTPUT.PUT_LINE ('Mileage expiration date of passenger is:  ' ||fMileageExpDate);
DBMS_OUTPUT.PUT_LINE (' ');

 EXCEPTION
    WHEN no_data_found THEN
     -- do something
     dbms_output.put_line('Results not found.Try again ');


END LOOP;

    CLOSE cur_FreqFlyer; --close cursor

END sp_GetMileageBalance;

2 个答案:

答案 0 :(得分:1)

  

“不知道为什么它会把这种情绪扼杀在我身上。”

EXCEPTION是PL / SQL块结构的一部分。

DECLARE
    ....
BEGIN
    ....
EXCEPTION
    ....
END 

每个部分都有特定的职责,并且仅限于与责任相关的代码。所以DECLARE部分用于声明(变量,本地过程),BEGIN部分用于过程代码,EXCEPTION部分用于处理异常。

通过将exception关键字放在您所做的位置,您终止了BEGIN部分并启动了异常处理程序。 close不是处理异常的有效语句,因此编译器会抛出异常。

答案 1 :(得分:0)

你可以这样做:

BEGIN 
   OPEN cur_FreqFlyer; --  open cursor for use   

   FETCH cur_FreqFlyer INTO fPassengerID,pFirst,pLast,fFreqflyernum,fFreqflyerMileage,
        fMileageBalance,fMileageExpDate;
   IF cur_FreqFlyer%NOTFOUND THEN
      dbms_output.put_line('Results not found.Try again ');
   END ID;

   LOOP   
      EXIT WHEN cur_FreqFlyer%NOTFOUND;

      DBMS_OUTPUT.PUT_LINE ('CUSTOMER INFORMATION: ');
      DBMS_OUTPUT.PUT_LINE (' ');
      DBMS_OUTPUT.PUT_LINE ('The Frequent Flyer PassengerID is:  ' ||fPassengerID);
      ...

      --Fetch cursor data
      FETCH cur_FreqFlyer INTO fPassengerID,pFirst,pLast,fFreqflyernum,fFreqflyerMileage,
        fMileageBalance,fMileageExpDate;

   END LOOP;

   CLOSE cur_FreqFlyer; --close cursor

END sp_GetMileageBalance;