没有返回任何行时使用COALESCE vs EXCEPTION(Oracle)

时间:2019-03-21 18:00:35

标签: sql oracle plsql

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

我尝试了两种不同的方法。一个将列合并为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;

另一个方法是处理EACH变量未返回任何行的异常。

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;

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

在性能方面,第一个更快,尽管没有添加额外的异常代码,但是您可以嵌入相同的代码,也不会有任何区别。