首页 > 解决方案 > 没有返回行时使用 COALESCE 与 EXCEPTION (Oracle)

问题描述

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

我尝试了两种不同的方法。一个合并列和空值(如下所示):

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;

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

提前致谢。

标签: sqloracleplsql

解决方案


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

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

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


推荐阅读