2015-04-12 282 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这三个电话,但它可能是唯一值得的,如果你要做到这一点打了很多电话。

相关问题