sql之NVL 或 EXCEPTION NO_DATA_FOUND

sxdcgaq8080 阅读:8 2024-02-25 17:59:16 评论:0

我在一个填充表的过程中使用了以下 sql

SELECT NVL(SUM(COL1), 0), 
       NVL(SUM(COL2), 0) 
  INTO v_mytable.COLUMN1, 
       v_mytable.COLUMN2 
  FROM t1, t2 
 WHERE t1.id = t2.id 
   AND t1.date = t2.date 

此外,对于 99% 的表行,这些列 = 0 并且此查询需要很长时间才能执行,因为在大多数情况下它会为两列返回 0。

使用异常处理是否更好,如下所示:
BEGIN 
  SELECT SUM(COL1), 
         SUM(COL2) 
    INTO v_mytable.COLUMN1, 
         v_mytable.COLUMN2 
    FROM t1, t2 
   WHERE t1.id = t2.id 
     AND t1.date = t2.date 
EXCEPTION WHEN NO_DATA_FOUND THEN 
  v_mytable.COLUMN1 := 0 ; 
  v_mytable.COLUMN2 := 0 ; 
END; 

谢谢。

请您参考如下方法:

这两个块做完全不同的事情。您的 SELECT 语句不会抛出 NO_DATA_FOUND如果 COL1 和/或 COL2 始终为 NULL,则出错。它只会在 v_mytable.COLUMN1 中放置一个 NULL和 v_mytable.COLUMN2 .

你可以做

SELECT SUM(COL1), 
       SUM(COL2) 
  INTO v_mytable.COLUMN1, 
       v_mytable.COLUMN2 
  FROM t1, t2 
 WHERE t1.id = t2.id 
   AND t1.date = t2.date 
 
v_mytable.COLUMN1 := NVL( v_mytable.COLUMN1, 0 ); 
v_mytable.COLUMN2 := NVL( v_mytable.COLUMN2, 0 ); 

然而,我不希望这会更快。


标签:Exception
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号