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

Oracle PL/SQL:检查视图中是否存在记录的有效方法?,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我有一个视图是建立在多个表上的,每天都有大量数据的事务表。我有一个Oracle作业,它从这个表中提取数据,如果数据不在视图中,那么它会记录一条适当的消息- DECLARE ln_countOfRecords NUMBER; BEGIN SELECT COUNT(1) INTO ln_countOfRecords FROM v_view_with_huge_data; --Data is also coming from DBLink tables

我有一个视图是建立在多个表上的,每天都有大量数据的事务表。我有一个Oracle作业,它从这个表中提取数据,如果数据不在视图中,那么它会记录一条适当的消息-

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语句所用的时间比预期的要长。 有谁能告诉我如何有效地检查视图中是否至少有一条记录


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

虽然我知道我们也都这样做,但我更清楚:-,不要使用COUNT,除非您确实需要知道给定条件下存在多少行。在您的示例中,您不关心存在多少行,只关心存在一行或多行。确定结果是否存在的更好方法如下:

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
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;
在某些情况下,我发现消除计数*需要一个表现不佳的程序,使其成为一个合格的跑步者

YMMV


分享和享受。

虽然我知道我们都会这样做,但我知道得更好:-,不要使用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;
在某些情况下,我发现消除计数*需要一个表现不佳的程序,使其成为一个合格的跑步者

YMMV



共享和享受。

相同的查询将应用于视图作为表,否?请不要再使用count1,@paragmeshram-count*是正确的语法@戴维多德里奇:count*和count1或count'foo'@a_horse_和_no_name之间没有区别,这是对的,但使用count1意味着相信古老的神话,即count是低效的,因为数据库必须像select*一样读取整行,读取1比读取整行更快,因此count1必须比count更高效,这恐怕是胡说八道。@davidardridge:这种想法当然是胡说八道。同样的查询也适用于视图作为表,不是吗?请不要再使用count1,@paragmeshram-count*是正确的语法@戴维多德里奇:count*和count1或count'foo'@a_horse_和_no_name之间没有区别,这是对的,但使用count1意味着相信古老的神话,即count是低效的,因为数据库必须像select*一样读取整行,读取1比读取整行更快,因此count1必须比count更高效,这恐怕是胡说八道。@davidardridge:这种想法当然是胡说八道。@horse_没有名字-我相信一旦它到达第一排,它就会停止处理。我的理解是对的吗?@a_horse_与_no_name我想Parag的意思可能是,一旦一行被识别为最终结果集的一部分,那么该部分查询执行将停止-因此rownum谓词在进行计数之前应用,因此计数只能返回0或1@shannonseverance您可能希望将ln_exists>0更改为ln_exists=1,以明确确认它只能是0或11@a_horse_with_no_name请检查小提琴。计数停止键在聚合之前被操作。@davidardridge:这太令人惊讶了。我没想到会这样。你生活和学习…@一匹没有名字的马-我相信一旦它到达第一排,它就会停止处理。我的理解是对的吗?@a_horse_与_no_name我想Parag的意思可能是,一旦一行被识别为最终结果集的一部分,那么该部分查询执行将停止-因此rownum谓词在进行计数之前应用,因此计数只能返回0或1@shannonseverance您可能希望将ln_exists>0更改为ln_exists=1,以明确确认它只能是0或11@a_horse_with_no_name请检查小提琴。计数停止键在聚合之前被操作。@davidardridge:这太令人惊讶了。我没想到会这样。你生活和学习……我认为使用ROWNUM是更优雅的解决方案。@APC-你说得对,使用ROWNUM的COUNT*更清晰。我从来没有运行过测试,我从来没有想到过这个想法,现在手头也没有Oracle实例。我很好奇如何使用ROWNUM我的意思是,我认为使用异常来处理正常的业务条件是很麻烦的,与Shannon的ROWNUM解决方案相比,更多的代码和表达方式不容易理解正在发生的事情。我认为使用ROWNUM是更优雅的解决方案。@APC-你说得对,使用ROWNUM的COUNT*更清晰。我从来没有运行过测试,我从来没有想到过这个想法,现在手头也没有Oracle实例。我很好奇如何使用ROWNUM我的意思是,我认为使用异常来处理正常的业务条件是很麻烦的,更多的代码和缺乏表达能力,与Sh相比,不太容易理解正在发生的事情 annon的ROWNUM解决方案。