PL / SQL查询未获取有限记录

时间:2010-11-22 16:19:52

标签: sql oracle plsql packages

我在包中有以下查询

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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

要在@Tony的帖子上略微扩展,当您从DATE值中减去一个数字时,该数字的度量单位将被假定为天数。因此,减去730492天相当于减去约2000年。我怀疑那不是你想做的事。

分享并享受。

答案 2 :(得分:2)

除了修复日期范围外,还有什么特别的理由使用动态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;