2014-01-28 55 views
0

我新的SQL,並希望一些幫助把這個變成一個函數功能:PL/SQL新手:用SELECT和SYSDATE

SELECT 
SYSDATE "Today's Date", 
NEXT_DAY(trunc(SYSDATE, 'MONTH')-1, 'Tuesday')"First Tuesday this Month", 
NEXT_DAY (LAST_DAY(SYSDATE)+1,'TUESDAY') "First Tuesday of Next Month" 
FROM DUAL; 

這是我在接通到上述功能的嘗試(如你可以看到它沒有這麼熱)...

CREATE OR REPLACE FUNCTION first_tuesday 
RETURN DATE 
AS 
    date1 DATE; 
    date2 DATE; 
    date3 DATE; 

BEGIN 

    date1 := SELECT SYSDATE; 
    date2 := SELECT NEXT_DAY(trunc(SYSDATE, 'MONTH')-1, 'Tuesday'); 
    date3 := SELECT NEXT_DAY (LAST_DAY(SYSDATE)+1,'TUESDAY'); 

RETURN 'todays date:' || date1, 
'first tuesday this month:' || date2, 
'first tuesday next month:' || date3; 

END; 
/
SELECT first_tuesday FROM DUAL; 

我在做什麼錯?

+4

一個函數只能返回一個單一的東西。你想讓你的函數返回一個代表下個月第一個星期二的「日期」嗎?你想讓你的函數返回一個帶有三個不同日期列的記錄嗎?或者你想做別的事情? –

回答

6

你真的想在那裏返回三個值。我建議將其分解爲單獨的函數,但將「今天的日期」留給sysdate調用。

你不需要發出一個SELECT查詢來填充一個變量,在這種情況下,你可以返回一個表達式。

CREATE OR REPLACE FUNCTION first_tuesday 
    RETURN DATE 
AS 
BEGIN 
    RETURN NEXT_DAY(trunc(SYSDATE, 'MONTH')-1, 'Tuesday') 
END; 
/

東西看出來這裏是一個SQL語句的執行中,SYSDATE總是具有相同的價值,但是這不是在PL/SQL的情況。因此,當sysdate在從SQL語句中調用的PL/SQL中計算時,您可以在每個上下文中獲得不同的值。所以,如果你撥打:

select sysdate col1, 
     some_function col2 
from dual; 

...,並在它的冗長的執行some_function計算SYSDATE,它可以使用比父SQL語句略有不同(後)值。

避免這個問題的辦法是SYSDATE傳遞到功能:

CREATE OR REPLACE FUNCTION first_tuesday (sysdate_in date) 
    RETURN DATE 
AS 
BEGIN 
    RETURN NEXT_DAY(trunc(sysdate_in, 'MONTH')-1, 'Tuesday') 
END; 
/

,那麼你會......

Select ... 
From invoices 
Where invoice_date < first_tuesday(sysdate) 

這是一個簡單的例子,只是爲了演示的原則,它真的只對從SQL調用的函數很重要。

說實話,你的情況大多數從業者可能會跳過功能,只是:

Select ... 
From invoices 
Where invoice_date < NEXT_DAY(trunc(sysdate, 'MONTH')-1, 'Tuesday') 

編輯:順便說一下,你可能想使用:

NEXT_DAY (LAST_DAY(SYSDATE),'TUESDAY') 

...不...

NEXT_DAY (LAST_DAY(SYSDATE)+1,'TUESDAY') 
+1

+1不只是爲了您的「大多數從業者」的建議。除非在第一個星期二的推導中還有一些附加規則,否則我會選擇使用本地SQL函數。 – APC

+0

謝謝,我仍然無法獲得顯示結果:錯誤的數量或類型的參數調用'FIRST_TUESDAY'。我同意創建一個函數並不是最簡單的方法。 – user3245946

+0

@ user3245946最好發佈函數的定義和你調用它的方式。 –