Oracle ORA-01403:未找到数据--异常处理不起作用
我的更新过程中有一个SQL语句块,它收集每条记录的交易日数,然后将其插入一个名为v_NO_of_days_RESP的整数变量中,例如通话的开放日期和响应日期之间的天数 这很好地工作,除了当有一个空的响应_日期时,ORA-01403:找不到数据错误失败。我理解它为什么会失败,因为它当然没有可插入的记录,但我似乎找不到一个绕过它的方法 在这些发现响应日期为NULL的情况下,我希望将v_NO_OF_DAYS_RESP var也设置为NULL,或者甚至以某种方式将SQL语句嵌套在IF中,以完全避免在响应日期为NULL时运行计算SQL语句 *简单地说,我想要以下几点:。。如果调用还没有响应日期,则不要运行SQL语句计算,或者只将var设置为Null 如有任何意见或建议,将不胜感激Oracle ORA-01403:未找到数据--异常处理不起作用,oracle,stored-procedures,oracle11g,cursor,Oracle,Stored Procedures,Oracle11g,Cursor,我的更新过程中有一个SQL语句块,它收集每条记录的交易日数,然后将其插入一个名为v_NO_of_days_RESP的整数变量中,例如通话的开放日期和响应日期之间的天数 这很好地工作,除了当有一个空的响应_日期时,ORA-01403:找不到数据错误失败。我理解它为什么会失败,因为它当然没有可插入的记录,但我似乎找不到一个绕过它的方法 在这些发现响应日期为NULL的情况下,我希望将v_NO_OF_DAYS_RESP var也设置为NULL,或者甚至以某种方式将SQL语句嵌套在IF中,以完全避免在响应
谢谢-开尔文处理异常将解决您的问题:
BEGIN
FOR v_LoadRec IN c_Load LOOP
SELECT count(1) INTO v_NO_OF_DAYS_RESP
from DIM_DATE
where DIM_DATE.TRADING_DAY_FLAG = 'Y' and
DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESPONSE_DATE,'YYYYMMDD')) and
DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD'))
group by v_LoadRec.CALL_NUMBER;
IF SQL%NOTFOUND THEN
v_NO_OF_DAYS_RESP :='';
END IF;
SELECT count(1) INTO v_NO_OF_DAYS_RESO
from DIM_DATE
where DIM_DATE.TRADING_DAY_FLAG = 'Y' and
DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESOLVE_DATE,'YYYYMMDD')) and
DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD'))
group by v_LoadRec.CALL_NUMBER;
IF SQL%NOTFOUND THEN
v_NO_OF_DAYS_RESO :='';
END IF;
END LOOP;
处理异常将解决您的问题:
BEGIN
FOR v_LoadRec IN c_Load LOOP
SELECT count(1) INTO v_NO_OF_DAYS_RESP
from DIM_DATE
where DIM_DATE.TRADING_DAY_FLAG = 'Y' and
DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESPONSE_DATE,'YYYYMMDD')) and
DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD'))
group by v_LoadRec.CALL_NUMBER;
IF SQL%NOTFOUND THEN
v_NO_OF_DAYS_RESP :='';
END IF;
SELECT count(1) INTO v_NO_OF_DAYS_RESO
from DIM_DATE
where DIM_DATE.TRADING_DAY_FLAG = 'Y' and
DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESOLVE_DATE,'YYYYMMDD')) and
DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD'))
group by v_LoadRec.CALL_NUMBER;
IF SQL%NOTFOUND THEN
v_NO_OF_DAYS_RESO :='';
END IF;
END LOOP;
获取SELECT查询中的记录计数。然后您可以验证count=0,也可以不验证。您可以这样尝试
if (v_LoadRec.RESPONSE_DATE) is null Then
v_NO_OF_DAYS_RESP:='';
else
SELECT count(1) INTO v_NO_OF_DAYS_RESP
from DIM_DATE
where DIM_DATE.TRADING_DAY_FLAG = 'Y' and
DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESPONSE_DATE, 'YYYYMMDD')) and
DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD'))
group by v_LoadRec.CALL_NUMBER;
IF SQL%NOTFOUND THEN
v_NO_OF_DAYS_RESP :='';
END IF;
end if;
获取SELECT查询中的记录计数。然后您可以验证count=0,也可以不验证。您可以这样尝试
if (v_LoadRec.RESPONSE_DATE) is null Then
v_NO_OF_DAYS_RESP:='';
else
SELECT count(1) INTO v_NO_OF_DAYS_RESP
from DIM_DATE
where DIM_DATE.TRADING_DAY_FLAG = 'Y' and
DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESPONSE_DATE, 'YYYYMMDD')) and
DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD'))
group by v_LoadRec.CALL_NUMBER;
IF SQL%NOTFOUND THEN
v_NO_OF_DAYS_RESP :='';
END IF;
end if;
因此,我通过将其放在IF语句中解决了这个问题。请看我上面的答案。因此,我通过将其放在IF语句中解决了这个问题。见上面我的答案。