2012-08-08 66 views
0

嗨我在Oracle中創建了以下函數。 我將不得不將date-1和date-2參數傳遞給函數,函數應該返回另一個日期給我。從Oracle函數返回數據?

請參閱下面的代碼。

create or replace function GETD(p_d1 in date, 
           p_d2 in date) return DATE 
    as 
     l_result DATE; 
    begin 
    SELECT EDIT_Date into l_result FROM qa.employees WHERE qa.employee_join_date BETWEEN TO_DATE(p_d1, 'MM/DD/YYYY') AND TO_DATE(p_d2, 'MM/DD/YYYY') AND ROWNUM <= 1 
    ; 
     return l_result; 
    end; 

我執行的功能如下

SELECT GETD('27-JUN-12','28-JUN-12') FROM DUAL 

被編譯的功能,而IM的參數並執行功能我得到以下錯誤「不是有效的月份」。 能有一個人請告訴我,我去錯了

感謝 賈斯汀

回答

1

首先,你不應該在一個日期變量調用TO_DATE。如果這樣做,則強制Oracle首先使用會話的NLS_DATE_FORMAT將日期轉換爲字符串,然後使用指定的格式掩碼將字符串轉換回日期。如果您的NLS_DATE_FORMAT發生與指定的格式掩碼不匹配(並且由於NLS_DATE_FORMAT由客戶端控制,某些用戶和會話將不可避免地具有不同的日期格式),您將收到錯誤消息。

假設您的意圖僅僅是忽略任何時間組件,您應該使用trunc函數。

create or replace function GETD(p_d1 in date, 
           p_d2 in date) 
    return DATE 
as 
    l_result DATE; 
begin 
    SELECT EDIT_Date 
    into l_result 
    FROM qa.employees 
    WHERE qa.employee_join_date BETWEEN trunc(p_d1) AND trunc(p_d2) 
    AND ROWNUM <= 1; 

    return l_result; 
end; 

rownum <= 1狀況的存在似乎有點odd--似乎不太可能,你真的想從匹配employee_join_date標準表中提取的任意行。不知道需求,看起來你可能想要做一些確定性的事情,以最小(或最大)edit_date來獲取行。其次,當你調用這個函數時,你應該傳遞參數DATE而不是傳入字符串,並讓Oracle使用會話的NLS_DATE_FORMAT將字符串隱式轉換爲日期。如果使用日期文字

SELECT GETD(date '2012-06-27', date '2012-06-28') 
    FROM DUAL 

或字符串轉換爲日期明確使用TO_DATE

SELECT GETD(to_date('27-JUN-12', 'DD-MON-RR'), to_date('28-JUN-12', 'DD-MON-RR')) 
    FROM DUAL 

那麼您的通話將不顧客戶的NLS_DATE_FORMAT的工作。

+0

謝謝巴迪它真的很有幫助.... !!! – 2012-08-08 17:55:32