首页 > 解决方案 > 当查询返回值并且没有“EXCEPTION WHEN NO_DATA_FOUND THEN”时传递数据(Oracle 11g)

问题描述

我创建了一个更新t_ritm表的过程。首先,我从表中选择rrcd_qnty了一个产品 ID(这是我的产品数量) 。t_rrcd然后我更新表中的 rrcd_qntyt_ritm

这是我的程序:

procedure update_ritm_new_rate(p_oid in varchar2, p_ritm_rate in varchar2, p_euser in varchar2)
is
nrate varchar2(4);
begin
    SELECT rrcd_rate into nrate 
    FROM (select oid, t_rrcd.rrcd_rate 
           from t_rrcd 
           where rrcd_ritm= p_oid 
           ORDER BY oid DESC ) 
    WHERE rownum <= 1 
    ORDER BY rownum DESC ;  
EXCEPTION  
    WHEN NO_DATA_FOUND THEN  nrate := 0; 


    update t_ritm 
    set ritm_rate = nrate, euser = p_euser, edat = sysdate  
    where oid = p_oid;
    commit;
end update_ritm_new_rate;

我的一些产品 id 数量是null. 所以我得到了No_Data_Found 错误。但是,他们成功更新了何时以及哪个产品 id 具有 Quantity 值。为了避免 No_Data_Found 我使用EXCEPTION WHEN NO_DATA_FOUND THEN nrate := 0; 它解决了我的no_Data_Found错误。但是当产品 id 具有数量值时,它们不会更新。

我已经搜索了很多这个问题,但没有得到好的解决方案。No_Data_Found避免错误的最佳实践应该是什么?如果我没有收到任何No_Data_Found错误,我可以传递我的价值吗?

预先感谢

标签: oracleplsqloracle11g

解决方案


那是因为 - 如果你SELECT返回一些东西,它永远不会到达UPDATE,因为它隐藏EXCEPTION处理程序后面。

因此,将它 ( SELECT) 包含在它自己的BEGIN-END块中,然后将其UPDATE取出,以便NRATE使用使用的任何值执行它。

PROCEDURE update_ritm_new_rate (p_oid         IN VARCHAR2,
                                p_ritm_rate   IN VARCHAR2,
                                p_euser       IN VARCHAR2)
IS
   nrate   VARCHAR2 (4);
BEGIN
   BEGIN                                               --> this
        SELECT rrcd_rate
          INTO nrate
          FROM (  SELECT oid, t_rrcd.rrcd_rate
                    FROM t_rrcd
                   WHERE rrcd_ritm = p_oid
                ORDER BY oid DESC)
         WHERE ROWNUM <= 1
      ORDER BY ROWNUM DESC;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         nrate := 0;
   END;                                               --> this

   UPDATE t_ritm
      SET ritm_rate = nrate, euser = p_euser, edat = SYSDATE
    WHERE oid = p_oid;

   COMMIT;
END update_ritm_new_rate;

推荐阅读