Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PLS错误:00103遇到符号“;例外情况;_Oracle_Stored Procedures_Plsql_Oracle11g - Fatal编程技术网

Oracle PLS错误:00103遇到符号“;例外情况;

Oracle PLS错误:00103遇到符号“;例外情况;,oracle,stored-procedures,plsql,oracle11g,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

因此,我创建了以下过程:

--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 ');
它给了我这个错误:

行/列错误


54/2 PLS-00103:在预期以下情况时遇到符号“异常”: (如果循环模式为null,则开始案例为goto声明结束退出 pragma raise return选择使用时更新
您可以这样实现:

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;
“我不知道为什么它会把这个吐到我身上。”

异常是PL/SQL块结构的一部分

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


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

您将
异常放在的位置似乎不正确。请提供整个错误代码。de>异常
块位于错误的位置-它要么需要在
结束sp_GetMileageBalance
之前,要么在循环中需要一个新块。但是代码中的任何内容都不能抛出
找不到数据
,那么为什么您要有它?如果第一次获取没有数据,您是否试图显示消息?光标是否可以查询实际返回多行?没错。如果用户输入一个数字,例如200、400。如果实际表本身中没有这些数字的记录,我希望异常处理程序说“嘿,没有结果。尝试输入不同的数字。”是的,存储过程中的这个游标能够返回多条记录,尝试输入不在表中的值,我得到的唯一回报是:PL/SQL过程成功完成,而不是错误消息Right,因为FETCH不会引发NO_DATA_FOUND异常-您只能通过SELECT语句获得该异常。那么,您有什么建议吗?如果我它位于存储过程的select语句之后。重新声明fetch语句的方法是什么?您希望它在光标第一次没有得到任何结果(并打印“未找到结果”)时表现不同吗,因此他们将第一次获取移到循环外。或者,您可以通过在循环内放置一个计数器,并在计数器=0时打印另一条消息来实现这一点。
DECLARE
    ....
BEGIN
    ....
EXCEPTION
    ....
END