2010-11-22 34 views
1

我已經在包下面的查詢PL/SQL查詢不獲取記錄有限

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萬條記錄,這使得這個查詢永遠返回。任何想法,可能的原因是它沒有提取特定的記錄?

回答

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 
+0

「l_days_between_start」的值正在根據此表達式進行計算。 `l_days_between_start:= l_now - i_start_date;' 「l_now = 22-NOV-10 04.50.18 PM」的值和「i_start_date = 16-NOV-10 04.59.22 PM」的值。這是`l_days_between_start = 730492.9937037037037037037037037037037037`。這裏有什麼不對勁? :( – 2010-11-22 16:53:18

2

要在@託尼的帖子稍微膨脹,當你從一個DATE值的單位OF-減去一個數那個數字的測量被假定爲幾天。因此,減去730492天相當於減去約2000年。我懷疑這不是你想要做的。

分享和享受。

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;