【问题标题】:Using COALESCE vs EXCEPTION when no rows are returned (Oracle)没有返回行时使用 COALESCE 与 EXCEPTION (Oracle)
【发布时间】:2019-08-12 16:07:17
【问题描述】:

我目前遇到一个错误,当我运行定义/选择到我设置的变量的存储过程时收到“未找到数据”错误消息。

我尝试了两种不同的方法。一个合并列和null(如下图):

BEGIN
  BEGIN
      SELECT COALESCE (max_value, 0) AS MAX_VALUE
        INTO v_max_v
        FROM table1
       WHERE car_code = rcar;
      --
      SELECT COALESCE (min_value, 0) AS MIN_VALUE
        INTO v_in_v
        FROM table1
       WHERE car_code = rcar;
  END
END;

另一种方法是处理没有为每个变量返回行的异常。

BEGIN
  BEGIN
      SELECT max_value AS MAX_VALUE
        INTO v_max_v
        FROM table1
       WHERE car_code = rcar;
  EXCEPTION
     WHEN NO_DATA_FOUND
     THEN v_max_v := NULL;
  END
      --
      SELECT min_value AS MIN_VALUE
        INTO v_min_v
        FROM table1
       WHERE car_code = rcar;
  EXCEPTION
     WHEN NO_DATA_FOUND
     THEN v_min_v := NULL;
  END
END;

哪种方法更有效/成本更低?有没有客观的方法来检查自己? (解释计划仅适用于我认为的查询)

提前致谢。

【问题讨论】:

  • 这些不做同样的事情。您仍然可以使用COALESCE() 得到NO_DATA_FOUND 错误。因此,您应该使用第二个,因为它不是您想要的。
  • 呃,我很笨。感谢您为我解决这个问题。不知道当我做出这个假设时我的思路是什么。

标签: sql oracle plsql


【解决方案1】:

NO_DATA_FOUND 不仅仅对应于某个值是否为空。它是一种默认异常类型,用于通知/处理记录是否存在。

您的比较无效。第一个根本与任何异常无关:它只是检查和替换值为 null 的值,并且不处理任何类型的异常。但在另一种情况下,异常块存在但没有用,直到出现不存在行的情况,而不是数据值或列值为空。

就性能而言,第一个更快,因为没有添加额外的异常代码,但您可以嵌入相同的代码,也不会有任何区别。

【讨论】:

  • 啊,我必须回到我的 SQL 101 书。在我的鲁莽中,我一定认为这是正确的,我很抱歉。
  • 当然。没有问题。
猜你喜欢
  • 2021-12-04
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多