【问题标题】:Suppress ORA-01403: no data found excpetion抑制 ORA-01403: 未找到数据异常
【发布时间】:2011-11-06 14:01:57
【问题描述】:

我有以下代码

SELECT SUM(nvl(book_value,
                   0))
    INTO v_balance
    FROM account_details
    WHERE currency = 'UGX';

--Write the balance away

SELECT SUM(nvl(book_value,
                   0))
    INTO v_balance
    FROM account_details
    WHERE currency = 'USD';

--Write the balance away

现在的问题是,表格中可能没有该特定货币的数据,但可能有“美元”货币的数据。所以基本上我想将总和选择到我的变量中,如果没有数据,我希望我的存储过程继续并且不抛出 01403 异常。

我也不想将每个 select 放入 BEGIN EXCEPTION END 块中的语句中,所以有什么方法可以抑制异常并将 v_balance 变量保持在未定义(NULL)状态而不需要异常块?

【问题讨论】:

  • 如果没有匹配,SUM 聚合函数不会抛出异常,它只是返回 null。你的代码应该已经做你想做的了。

标签: oracle plsql


【解决方案1】:
select nvl(balance,0) 
into v_balance
from 
(
    select sum(nvl(book_value,0)) as balance
    from account_details
    where currency = 'UGX'
);

【讨论】:

  • 你的语句相当于 select nvl(sum(book_value),0) into v_balance from account_details where currency = 'UGX'
  • 正确且比内部选择简单得多:)
【解决方案2】:
SELECT L1.PKCODE L1CD,  L1.NAME L1N, L1.LVL L1LVL,
          L2.PKCODE L2CD, L2.NAME L2N,  L2.LVL L2LVL,
          L5.PKCODE L5CD, L5.NAME L5N,

INFOTBLM.OPBAL (  L5.PKCODE, :PSTDT, :PSTUC, :PENUC, :PSTVT, :PENVT ) OPBAL,
INFOTBLM.DEBIT    ( L5.PKCODE, :PSTDT,:PENDT, :PSTUC, :PENUC, :PSTVT, :PENVT ) AMNTDR,
INFOTBLM.CREDIT ( L5.PKCODE, :PSTDT,:PENDT, :PSTUC, :PENUC, :PSTVT, :PENVT ) AMNTCR

FROM   FSLVL  L1, FSLVL L2,  FSMAST L5

WHERE  L2.FKCODE  =  L1.PKCODE
AND        L5.FKCODE  =  L2.PKCODE

AND        L5.PKCODE Between :PSTCD AND NVL(:PENCD,:PSTCD)

GROUP BY  L1.PKCODE ,  L1.NAME , L1.LVL ,
                 L2.PKCODE , L2.NAME ,  L2.LVL ,
                 L5.PKCODE , L5.NAME 

ORDER BY L1.PKCODE, L2.PKCODE,  L5.PKCODE

【讨论】:

  • 您能否对其添加任何解释,以便其他人可以重现您解决问题的尝试,如果他们因为遇到类似问题而提出这个问题?
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 2021-06-19
相关资源
最近更新 更多