代码之家  ›  专栏  ›  技术社区  ›  x.509

PL/SQL查询不获取有限的记录

  •  1
  • x.509  · 技术社区  · 15 年前

    我在一个包中有以下查询

    l_sql := 'SELECT  table_name.field1,
                      table_name.field2,
                      table_name.field3
                FROM table_name
                WHERE table_name.status = ''ACTIVE'' AND
                      table_name.replication_date >= SYSDATE - :l'
    
    OPEN zequi_cur FOR l_sql USING l_days_between_start;
    

    理想情况下,它应该只选择那些满足条件的记录 SYSTDATE-:l . 价值 l 是 730492 . 但它仍在收集所有的记录。这个表有大约3000万条记录,这使得这个查询永远返回。有什么想法,有什么可能的原因,它不只是获取特定的记录?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Tony Andrews    15 年前

    SYSDATE-730492给出的日期是公元10年,即2000年前。我无法想象这就是你的意思?

    如果您的起始日期是0010年,您将得到730492作为差额:

    SQL> select to_date ('22-NOV-2010 04.50.18 PM','DD-MON-YYYY HH.MI.SS AM')
      2         - to_date ('16-NOV-0010 04.59.22 PM','DD-MON-YYYY HH.MI.SS AM') as diff
      3  from dual;
    
          DIFF
    ----------
    730492.994
    
        2
  •  2
  •   Bob Jarvis - Слава Україні    15 年前

    要在@Tony的post上稍微展开,当您从日期值中减去一个数字时,该数字的度量单位假定为天。因此,减去730492天相当于减去大约2000年。我想那不是你想做的。

    分享和享受。

        3
  •  2
  •   Martin Schapendonk    15 年前

    除了修复日期范围外,使用动态SQL还有什么特殊原因吗?也许最好使用静态光标:

    declare
      cursor c_cur(b_offset in number) is
        SELECT  table_name.field1,
                table_name.field2,
                table_name.field3
          FROM  table_name
          WHERE table_name.status = ''ACTIVE'' AND
                table_name.replication_date >= SYSDATE - b_offset
      ;
    begin
      open c_cur(l_days_between_start);
      ...
    end;