【问题标题】:Set division by 0 to return 0设置除以 0 返回 0
【发布时间】:2020-03-19 13:37:18
【问题描述】:

我突然想到 PL/SQL 可能有一种更简洁的方法:

我有一个程序可以发生被零除,但在所有情况下我都希望它返回 0。我当前的逻辑如下所示:

if bar <> 0 then
    foobar := foo/bar;
else
    foobar := 0;
end if;

有谁知道更简单/更便宜的方法吗?我对 PL/SQL 相当陌生,我看到我可以使用异常处理程序,但这似乎跳过了操作。所以我想我可以为zero_divide 做一个例外,然后就这样做:

foobar := 0;
foobar := foo/bar;

不过,我担心这并不容易理解。感谢您的任何见解!

【问题讨论】:

  • 是的,我认为使用你的逻辑没有问题。
  • 未定义除以 0,因此正确的解决方案是 foobar := foo/NULLIF(bar,0);
  • @WernfriedDomscheit :这就是我问这个问题的原因;我特别希望它返回 0 而不是数学上正确的结果:P
  • 好吧,你可以用 coalesce 或 nvl 包裹表达式,例如nvl(foo/nullif(bar,0),0) - 但是,下面的 case 建议看起来更整洁。
  • 哦,但这很聪明。老实说,我发现它更具可读性(我喜欢函数符号)。

标签: oracle plsql divide-by-zero


【解决方案1】:

尝试以下方法:

declare
  foo    integer := 1;
  bar    integer := 0;
  foobar integer;
begin
  foobar := case bar when 0 then 0 else foo/bar end;
  dbms_output.put_line(foobar);  
end;

输出:

0

【讨论】:

    【解决方案2】:

    使用CASE?

    foobar = case when bar = 0 then 0
                  else foo/bar
             end;
    

    【讨论】:

    • 谢谢,我知道你是第一个建议这种方法的人。我不知道CASE 或如何使用它;这是一个很好的例子,我可以将它应用于未来(和过去!)的问题:)
    【解决方案3】:

    您也可以使用exception 处理它。

    BEGIN
       foobar := foo/bar;
    EXCEPTION 
       WHEN ZERO_DIVIDE THEN
          foobar := 0;
    END;
    /
    

    【讨论】:

    • 我曾考虑过这种方法,但在这种特殊情况下似乎更加复杂。当我遇到未来的异常时,我会记住这一点:) 所以为了清楚起见,这意味着我可以在任何可能导致异常的块之后添加自定义异常? (我问是因为在我目前的情况下,我必须为一堆不同的变量这样做)。在我知道的一种语言中,异常实际上可以覆盖输出。例如,当foo/bar 抛出异常时,您的处理程序可以返回 0,那么赋值将使用 0 作为结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多