日期:2014-05-17  浏览次数:21244 次

PL/SQL程序块异常处理问题
SQL code

declare
   sum_balance   int;
   cus_name      varchar2 (20);
   err exception;
begin
   cus_name:='&p_cus_name';
     select sum(balance)
       into sum_balance
       from account, depositor
      where customer_name = cus_name
            and account.account_number = depositor.account_number;
   if sum_balance < 400
   then
      dbms_output.put_line ('Bronze Customer');
   elsif sum_balance < 700
   then
      dbms_output.put_line ('Silver Customer');
   else
      dbms_output.put_line ('Golden Customer');
   end if;
exception
   when no_data_found
   then
      dbms_output.put_line ('No such customer');
end;


第一次运行时能正常运行,但是随后随便我输入个什么名字,查询结果都是“Golden customer”,在没有添加异常处理代码前,输入不存在的用户时能正常报错,但是在加入异常处理代码并运行了几遍后再删掉异常处理代码,却又不报错了!请问是什么原因呀?

------解决方案--------------------
首先lz用的异常处理从后面看明显是系统异常,所以没有必要定义异常变量,再次是cus_name:='&p_cus_name',这个我看不太懂,你这个是要用变量绑定还是什么,用变量绑定也不是这样写啊.
------解决方案--------------------
试了下,加不加Excepiton都是输出Golden Customer,楼主讲的报错信息是什么呢?
SQL code
DECLARE 
v_totnum INT;
BEGIN 
  SELECT Sum(1) INTO v_totnum FROM txdses41 WHERE 1=2;
  IF v_totnum<400 THEN 
    Dbms_Output.put_line('Bronze Customer');
  ELSIF v_totnum<700 THEN 
    Dbms_Output.put_line('Silver Customer');
  ELSE
    Dbms_Output.put_line('Golden Customer');
  END IF;
  
--EXCEPTION WHEN No_Data_Found THEN 
  --Dbms_Output.put_line('No such customer');
END;

------解决方案--------------------
没数据的话,sum()会返回null,自然跑到最后一个else里面
------解决方案--------------------
探讨
SQL code

declare
sum_balance int;
cus_name varchar2 (20);
err exception;
begin
cus_name:='&amp;p_cus_name';
select sum(balance)
into sum_balance
from account, d……