Oracle10g 无数据存在时,未发现错误

Oracle10g 无数据存在时,未发现错误,oracle10g,Oracle10g,我在PL/SQL方面相对较新,所以我要问的可能听起来有些初级。我正在尝试运行以下代码,并在不应该的时候得到一个No_Date_Found错误。我正在尝试执行一个循环。我试图根据另一个变量将一组值选择为变量。突出显示的粗体线是发生错误的地方。如果我用该行中的文字值替换v_-tarrium_-code变量,则不再发生错误。请帮忙 set serveroutput on declare v_remaining_arrears number := 0; v_tariff_code date; v_tar

我在PL/SQL方面相对较新,所以我要问的可能听起来有些初级。我正在尝试运行以下代码,并在不应该的时候得到一个No_Date_Found错误。我正在尝试执行一个循环。我试图根据另一个变量将一组值选择为变量。突出显示的粗体线是发生错误的地方。如果我用该行中的文字值替换v_-tarrium_-code变量,则不再发生错误。请帮忙

set serveroutput on
declare
v_remaining_arrears number := 0;
v_tariff_code date;
v_tariff_store date; --a variable that stores the value of the previous tariff while the above variable takes the next tariff code value 
v_session_start_date date; --session start date
v_con_date date; --connection date
v_start_date date;
v_c_code varchar2(10);
v_cat_code number;
vunits number;
v_w_rate number;
v_s_rate number;
v_multiples number;
v_session_current varchar2(20);
v_counter number;
v_date1 date;
v_date2 date;


begin
v_c_code := 'D2203447'; 
v_session_current := 'JAN2014-FEB2014';
--V_SESSION_START_DATE := '01-JAN-14';
--v_date1 := v_session_start_date; --v_date1 would always begin as the session start date
--select v_session_start_date into v_date1 from dual;
--loop
select cat_code, units, con_date into v_cat_code, vunits, v_con_date from consumer where c_code = v_c_code;
    select start_date into v_session_start_date from bill_session where session_code = v_session_current;


v_start_date := v_session_start_date;

loop
v_start_date := v_start_date - 30;

select MAX(tariff_code) INTO v_TARIFF_CODE from tariff where tariff_code < V_START_DATE;

**select w_rate, s_rate into v_w_rate, v_s_rate from cat_tariff where cat_code = v_cat_code and 
tariff_code = v_tariff_code;** 



v_remaining_arrears := v_remaining_arrears + ((round(v_w_rate *v_multiples*vunits) + round(v_s_rate * vunits)));

exit when v_start_date < v_con_date;


--DBMS_OUTPUT.PUT_LINE('ARREARS = ' || V_REMAINING_ARREARS);

end loop;

DBMS_OUTPUT.PUT_LINE('ARREARS = ' || V_REMAINING_ARREARS);

end;
打开服务器输出
声明
v_剩余_欠款数:=0;
v_关税代码日期;
v_关税_储存日期--一个变量,存储上一个税则的值,而上述变量取下一个税则代码值
会议开始日期--会话开始日期
v_con_日期--连接日期
开始日期;
v_c_代码varchar2(10);
v_cat_代码;
vunits数;
v_w_费率编号;
v_s_费率编号;
v_乘以数字;
v_session_current varchar2(20);
v_计数器编号;
v_日期1日期;
v_日期2日期;
开始
v_c_代码:='D2203447';
v_会话_当前:=“2014年1月-2014年2月”;
--课程开始日期:=“2014年1月1日”;
--v_date1:=v_session_start_date--v_date1将始终作为会话开始日期开始
--从dual中选择v_session_start_date进入v_date1;
--环路
从消费者中选择cat_代码、单位、con_日期到v_cat_代码、vunits、v_con_日期,其中c_代码=v_c_代码;
选择开始日期进入v_会话\u开始日期自bill_会话,其中会话代码=v_会话\u当前;
v_开始日期:=v_会话开始日期;
环
v_开始日期:=v_开始日期-30;
从关税代码<起始日期的关税中选择MAX(关税代码)进入v关税代码;
**从cat_费率中选择w_费率、s_费率到v_w_费率、v_s_费率,其中cat_代码=v_cat_代码,并且
关税代码=v关税代码;**
v_剩余欠款:=v_剩余欠款+(四舍五入(v_剩余费率*v_倍数*vunits)+四舍五入(v_剩余费率*vunits));
当开始日期<结束日期时退出;
--DBMS_OUTPUT.PUT_LINE('欠款='| | V|剩余_欠款);
端环;
DBMS_OUTPUT.PUT_LINE('欠款='| | V|剩余_欠款);
终止
你能帮忙吗

select w_rate, s_rate 
into v_w_rate, v_s_rate 
from cat_tariff 
where cat_code = v_cat_code and tariff_code = v_tariff_code;
这是一个精确的获取,它必须只返回一条记录。Is查询返回零条或多条记录,然后返回导致异常的记录

尝试添加
dbms_输出.put_行(v_cat_代码| | |','| | v|关税_代码)在查询之前。在异常之前,此行将显示
v_cat_code
v_tariff_code
的问题值

您可能会忽略此异常,只处理肯定返回数据的情况。在这种情况下,您应该使用
BEGIN…EXCEPTION…END

begin
  select w_rate, s_rate 
  into v_w_rate, v_s_rate 
  from cat_tariff 
  where cat_code = v_cat_code and tariff_code = v_tariff_code;
  -- DO SOMETHING USEFULL WITH v_w_rate, v_s_rate 
exception
  when no_data_found then null;
  when others then raise;
end;

感谢您的回复,我添加了dbms|u output.put|u line(v|u cat|u code | | | | | v| u tariff|u code)行;但我得到了同样的错误。这个查询实际上是一个精确的获取,如果我用一个文本值替换v_代码,我不会得到任何错误。v_关税代码的值应为从关税代码