NVL或EXCEPTION NO_DATA_FOUND

mch*_*cha 3 sql oracle performance plsql exception-handling

我有一个程序,填写表格以下的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
Run Code Online (Sandbox Code Playgroud)

此外,对于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;
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jus*_*ave 7

这两个块完全不同.NO_DATA_FOUND如果COL1和/或COL2始终为NULL,则SELECT语句不会引发错误.它只会在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 );
Run Code Online (Sandbox Code Playgroud)

但是,我不希望它更快.