Oracle PL / SQL:检查视图中是否存在记录的有效方法?

时间:2013-03-23 06:51:07

标签: oracle plsql oracle11g

我有一个视图,它构建在具有大量数据的多个表(每日事务表)上。我有一个Oracle作业从该表中提取数据,如果VIEW中没有数据,则会记录相应的消息 -

DECLARE
ln_countOfRecords NUMBER;
BEGIN
      SELECT COUNT(1)
      INTO ln_countOfRecords
      FROM v_view_with_huge_data; --Data is also coming from DBLink tables

      IF ln_countOfRecords > 0
      THEN
         p_log_message('data found');
         --further processing
         ...
         ...
      ELSE
         p_log_message('no data found');
      END IF;
END

现在,select语句花费的时间比预期的要长。 谁能告诉我如何有效地检查视图中是否至少有一条记录。

请注意::这不是一个重复的问题,因为我指的是VIEW而不是TABLE。

2 个答案:

答案 0 :(得分:3)

DECLARE
    ln_exists NUMBER;
BEGIN
      SELECT COUNT(*)
      INTO ln_exists
      FROM v_view_with_huge_data --Data is also coming from DBLink tables
 /**/ WHERE rownum <= 1 /**/

      IF ln_exists > 0
      THEN
         p_log_message('data found');
         --further processing
         ...
         ...
      ELSE
         p_log_message('no data found');
      END IF;
END

答案 1 :(得分:1)

虽然我知道我们都这样做(我也是如此,即使我知道更好:-),除非你真的需要知道你的特定条件存在多少行,否则不要使用COUNT。在您的示例中,您不关心存在多少行,只存在一个或多个行。找出结果是否存在的更好方法如下:

DECLARE
  nField_value
  bRows_exist        BOOLEAN := FALSE;
BEGIN
  BEGIN
    SELECT some_field_from_view
      INTO nField_value
      FROM v_view_with_huge_data;

    -- Handle the case where only one row exists in the view

    bRows_exist := TRUE;
  EXCEPTION
    WHEN TOO_MANY_ROWS THEN  -- multiple rows exist in the view
      bRows_exist := TRUE;

    WHEN NO_DATA_FOUND THEN  -- no rows in the view
      bRows_exist := FALSE;
  END;

  IF bRows_exist = TRUE THEN
    p_log_message('data found');
    --further processing
         ...
         ...
  ELSE
    p_log_message('no data found');
  END IF;
END;

在某些情况下,我发现消除COUNT(*)需要一个表现不佳的程序并使其成为一个合适的跑步者。

因人而异。

分享并享受。