0

正如标题所说,我需要能够引发异常。我目前遇到的异常给了我这个错误:

DBMS_OUTPUT.PUT_LINE (‘No rows found’);
                      *
ERROR at line 39: 
ORA-06550: line 39, column 23: 
PLS-00103: Encountered the symbol "`" when expecting one of the following: 
( ) - + case mod new not null others <an identifier> 
<a double-quoted delimited-identifier> <a bind variable> 
table avg count current exists max min prior sql stddev sum 
variance execute multiset the both leading trailing forall 
merge year month DAY_ hour minute second timezone_hour 
timezone_minute timezone_region timezone_abbr time timestamp 
interval date 
<a string literal with character set specification> 

这是我的代码:

SET SERVEROUTPUT ON FORMAT WRAP SIZE 12000 
Declare 
v_model VARCHAR2(40);
v_carcategory VARCHAR2(40);
v_totalcars NUMBER;
v_maxdate DATE:=TO_DATE(1, 'J');
Cursor carcur IS 
SELECT * FROM i_car;
CURSOR c1(v_car_registration VARCHAR2) IS 
SELECT * from i_booking a
WHERE a.registration=v_car_registration;
Begin  
For car_rec in carcur
LOOP
v_maxdate:=TO_DATE(1, 'J');
for rec in c1(car_rec.registration)
LOOP
IF rec.date_reserved > v_maxdate 
then
v_maxdate:=rec.date_reserved ;
If car_rec.Cost <=50000 THEN v_carcategory := 'Budget Car';
End IF;
If car_rec.Cost BETWEEN 50000 AND 100000 THEN v_carcategory := 'Standard Car';
End IF;
If car_rec.Cost >=100000 THEN v_carcategory := 'Premium Car';
End If;
end IF;
v_totalcars := findtotalcarmodels (car_rec.model_name);
end loop;
DBMS_OUTPUT.PUT_LINE('Registration:'|| ' '|| car_rec.registration); 
DBMS_OUTPUT.PUT_LINE('Cost:'|| ' $' || car_rec.Cost); 
DBMS_OUTPUT.PUT_LINE('Model Name:'|| ' '|| car_rec.model_name); 
DBMS_OUTPUT.PUT_LINE('Car Category:'|| ' '||v_carcategory);
DBMS_OUTPUT.PUT_LINE('Total number of Cars:'|| ' '||v_totalcars);
DBMS_OUTPUT.PUT_LINE('Most Recent Rental Date: '|| ' '||v_maxdate);
DBMS_OUTPUT.NEW_LINE; 
END LOOP; 
EXCEPTION 
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE (‘No rows found’);
END;
/

我不太确定我的异常的定位。任何建议将不胜感激。

4

1 回答 1

2

直接的问题是您的dbms_output.put_line调用使用 Microsoft 大引号而不是标准的单引号字符来分隔字符串。您需要使用标准字符,而不是 Microsoft 字符(所有其他字符串似乎都在使用标准字符)。

退后一步,no_data_found仅在 call 中捕获异常是没有意义的dbms_output。无法保证写入的数据dbms_output将永远发送到客户端应用程序或客户端应用程序将永远将其显示给用户。

您似乎也没有任何可能引发no_data_found异常的代码。打开返回 0 行的游标不会导致异常。如果您希望恰好收到 1 行,则可以编写一个SELECT INTO语句,如果返回 1 行以外的任何内容,则会引发异常。如果您的目标是确定您在循环中迭代了多少次,那么您可能会使用%rowcount光标的属性。

最后,如果您对代码进行格式化,以便根据它们所属的块来缩进,这将使您的想法更加清晰。像这样的代码

FOR rec IN cursor
LOOP
  IF <<something>>
  THEN
    <<do something>>
  END IF;

  IF <<something else>>
  THEN 
    <<something else>>
  END IF;

  <<more stuff>>
END LOOP;

更容易遵循。

于 2013-10-18T21:26:35.910 回答