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