2015-04-12 81 views
0
CREATE OR REPLACE FUNCTION dtqrtr(generationDate DATE) 
RETURN DATE 
IS 
    dquery DATE; 
BEGIN 
    dquery := TRUNC(TO_DATE (generationDate),'YEAR'); 
    dquery := TRUNC(TO_DATE (generationDate),'Q'); 
    dbms_output.put_line ('First_Quarter : ' || dquery || ' '||'Last_Quarter : ' || add_months(dquery -1,3)); 
END dquery; 

END dtqrtr; 

SELECT dtqrtr('20-JAN-2015') 
FROM DUAL; 

我想要季度的第一天和第一天。但我收到錯誤消息:使用Oracle中的函數查找季度的第一天和最後一天

ORA-06575:包裝或功能DTQRTR處於無效狀態

+1

嗯,只要我們知道了什麼錯誤消息是... –

+0

ORA-06575:包裝或功能DTQRTR處於無效狀態 這是錯誤messege – user3722544

+0

當您運行了'SELECT'就是你得到的錯誤查詢。該功能的問題是別的。我建議你再次執行'CREATE OR REPLACE FUNCTION',然後(假設你正在使用SQLPlus)鍵入'SHOW ERRORS FUNCTION DTQRTR';這會顯示最近編譯這個函數所導致的編譯錯誤。祝你好運。 –

回答

1

ORA-06575意味着你的函數有錯誤編譯。很可能你的函數代碼中有一些語法錯誤。從SQL * Plus(和其他一些工具),你可以通過使用顯示錯誤:

SHOW ERROR; 

SHOW ERROR FUNCTION dtqrtr; 

在這裏,我猜測是你有太多的END語句...和,正如在下面的評論中Ben所注意到的,函數必須返回一個值。最後,你也可以在主體的第一行寫入dquery,以覆蓋下一行。

+1

是的,加上一個函數必須返回一些東西。 – Ben

+0

@Ben是的,這是正確的。我認爲OP寫了'end dquery'而不是'return dquery'。 –

1

這應該工作...

CREATE OR REPLACE FUNCTION dtqrtr(generationDate DATE) 
RETURN DATE 
IS 
    dquery DATE; 
BEGIN 
    dquery := TRUNC(TO_DATE (generationDate),'YEAR'); 
    dquery := TRUNC(TO_DATE (generationDate),'Q'); 
    dbms_output.put_line ('First_Quarter : ' || dquery || ' '||'Last_Quarter : ' || add_months(dquery -1,3)); 
    RETURN dquery; 
END dtqrtr; 
/

SELECT dtqrtr('20-JAN-2015') 
FROM DUAL; 
+0

一個函數必須返回一些東西... – Ben

+0

這段代碼沒有返回值.....類型RETURN(dquery)在結束之前dtqrtr;我解決了這個問題,但是這種返回類型只顯示一個值,我應該怎麼做才能獲得多個值 – user3722544

+1

@ user3722544 - 請不要在註釋中提出其他問題 - 並且不要回過頭來編輯此問題以包含第二個問題。如果您有其他問題,請發佈另一個問題。謝謝。 –

0

你想兩個值:本季度的第一天,本季度的最後一天。這對於只能返回單個值的函數來說是不合適的。然而,這兩個值很容易推導與內置SQL函數:

with cte as (select date '2015-01-20' dt from dual) 
select trunc(dt, 'Q') as qtr_st 
     , last_day(add_months(trunc(dt, 'Q'),2)) as qtr_end 
from cte 
/

你可能會考慮在用戶定義的函數包裝爲QTR_END這三個電話,但它可能是唯一值得的,如果你要做到這一點打了很多電話。

相關問題