查询WHEN NO_DATA_FOUND子句。不好的做法?

时间:2016-02-06 15:33:37

标签: oracle plsql

我们工作的开发人员一直在使用以下构造:

BEGIN    
  SELECT field1 
  INTO l_field1
  FROM table1
  WHERE field2 = 'some value'
EXCEPTION
  WHEN NO_DATA_FOUND
  THEN
     SELECT field2 
     INTO l_field2
     FROM table2
     WHERE field3 = 'some value'
   ...
END;

基本上意味着什么 - 如果你在第一张表中找不到记录,那就去看看第二张表。

我有一种强烈的感觉,这是错误的,是一种糟糕的懒惰习惯。但是你会怎么做呢?你会先得到table1中的COUNT,如果行数为零,那么去看看table2吗?

2 个答案:

答案 0 :(得分:0)

如果您要求其他方式,可以使用以下方式。当没有找到数据被认为处理错误或警告时,而不是条件。例外可以帮助您处理错误,如果您尝试运行多个选择并且您有错误。例外将帮助您检测到您检查以下示例。

BEGIN   
declare cnt number(4); 
select count(1) into cnt from table1 where field2 = 'some value';
if cnt >0 then
  SELECT field1 
  INTO l_field1
  FROM table1
  WHERE field2 = 'some value'
else if cnt =0 then
  SELECT field2 
     INTO l_field2
     FROM table2
     WHERE field3 = 'some value';
end if;
   END;

除了例外,您可以方便地处理错误,而无需编写多个检查,如下所示:

BEGIN
   SELECT ...
   SELECT ...
   SELECT ...
   ...
EXCEPTION
   WHEN NO_DATA_FOUND THEN  -- catches all 'no data found' errors

有关异常和处理错误的更多信息,请检查Oracle Documentation

答案 1 :(得分:0)

我反对" SELECT-in-an-EXCEPTION"东西是它嵌套没有业务嵌套的块。我的偏好是使用布尔指示符变量,类似于以下内容:

DECLARE
  bNot_found  BOOLEAN := FALSE;
  l_field1    TABLE1.FIELD1%TYPE;
  l_field2    TABLE2.FIELD2%TYPE;
BEGIN
  BEGIN    
    SELECT field1 
      INTO l_field1
      FROM table1
      WHERE field2 = 'some value';
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      bNot_found := TRUE;
  END;

  IF bNot_found THEN
   SELECT field2 
     INTO l_field2
     FROM table2
     WHERE field3 = 'some value';
  END IF;

  -- Go thou and do good works

END;