2014-11-05 63 views
0

我製作瞭如下的Oracle軟件包。在Oracle PACKAGE中比較日期類型不起作用

我會像'2014-11-05'一樣傳遞參數String。

--SEARCH 2014 11 04 
FUNCTION SEARCHMYPAGE(v_created_after IN DATE, v_created_before IN DATE) 
return CURSORTYPE is rtn_cursor CURSORTYPE; 
BEGIN 
OPEN 
rtn_cursor FOR 
    select 
    news_id 
    from 
    (
    select 
     news_id, 
     news_title, news_desc, 
     created, news_cd 
    from 
     news 
    ) 
    where 
    1=1 
    AND (created BETWEEN decode(v_created_after, '', to_date('2000-01-01', 'YYYY-MM-DD'), to_date(v_created_after, 'YYYY-MM-DD')) 
    AND (decode(v_created_before, '', sysdate, to_date(v_created_before, 'YYYY-MM-DD')) + 0.999999)); 
return rtn_cursor ; 
END SEARCHMYPAGE; 

我在Eclipse控制檯消息中確認了我的參數,因爲我正在使用Eclipse IDE。 我收到了2014-10-29〜2014-10-31製作的內容。

當我通過「2014年11月1日」作爲created_after,它返回0的記錄。(但我希望所有的內容,因爲每個內容10-29和10-31之間製造)

你會發現我的功能有問題嗎?

感謝:d

回答

1
create function search_my_page(p_created_after in date, p_created_before in date) 
return cursortype 
    is rtn_cursor cursortype; 
begin 
    open rtn_cursor for 
    select news_id 
    from news 
    where created between 
     nvl(v_created_after, date '1234-01-01') 
     and 
     nvl(v_created_before, sysdate) + interval '1' day - interval '1' second; 

    return rtn_cursor; 
end search_my_page; 
/

變化:

  1. 重新寫謂詞 - 有放錯地方的括號改變的意思。
  2. 用日期文字和變量替代to_date。由於您已經在使用ANSI日期格式,所以不妨使用文字。日期變量不需要轉換爲日期。
  3. 用簡單的NVL替換DECODE。
  4. 刪除了多餘的括號。
  5. 將v_重命名爲p_。通常使用p_表示「參數」,v表示「(本地)變量」。
  6. 刪除了額外的內聯視圖。通常,內聯視圖沒有得到充分利用,在這種情況下,它似乎沒有多大幫助。
  7. 刪除不必要的1 = 1。
  8. 用日期間隔替換0.99999,使數學更清晰。
  9. 更改爲小寫(這不是COBOL),爲函數名稱加下劃線。
  10. 更改爲2000-01-01至1234-01-01。如果你使用魔法值,它應該看起來不尋常 - 不要試圖隱藏它。
+0

感謝您的有意義的答案。我的問題解決了,我得到了額外的提示:D b – 2014-11-05 04:23:38