PL / SQL Query не получает ограниченные записи - PullRequest
1 голос
/ 22 ноября 2010

У меня следующий запрос в пакете

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.Но это все еще извлекает ВСЕ записи.и эта таблица имеет около 30 миллионов записей, что делает этот запрос навсегда возвращаемым.какие-либо идеи, что может быть причиной того, что он не выбирает только определенные записи?

Ответы [ 3 ]

4 голосов
/ 22 ноября 2010

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 голосов
/ 22 ноября 2010

Помимо исправления вашего диапазона дат, есть ли какая-то особая причина для использования динамического 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;
2 голосов
/ 22 ноября 2010

Чтобы немного расширить пост @ Тони, когда вы вычитаете число из значения DATE, единицей измерения этого числа считается дни. Следовательно, вычитание 730492 дней эквивалентно вычитанию около 2000 лет. Я подозреваю, что это не то, что вы хотели сделать.

Делись и наслаждайся.

...