我有一个带有三个参数的plsql函数count_order_cust
。但p_start
和p_end
是可选的。如果我用三个参数调用函数,那么函数执行得很好,但如果我用一个参数p_id
调用函数,那么它必须计算去年的订单(即2013年1月1日 - 2013年12月31日)这是我的问题。我怎样才能做到这一点?
这是函数count_order_cust
:
CREATE OR REPLACE FUNCTION count_order_cust(p_id f_customers.id%TYPE, p_sd f_orders.order_date%TYPE DEFAULT NULL, p_ed f_orders.order_date%TYPE DEFAULT NULL)
RETURN NUMBER IS v_count_orders NUMBER(3) := 0;
BEGIN
SELECT COUNT(cust_id) INTO v_count_orders
FROM f_orders
WHERE cust_id = p_id AND f_orders.order_date BETWEEN p_sd AND p_ed;
RETURN v_count_orders;
EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL;
END count_order_cust;
有了这个选择,我在去年得到了日期,但我需要在p_sd =' 01 / Jan / 2013'并且在p_ed =' 31 / Dec / 2013'。
select add_months(sysdate,-12) from dual;
答案 0 :(得分:1)
以下代码显示了如何派生所需日期,然后将代码捆绑到可用作过程默认参数的函数中:
declare
function getFirstDayOfLastYear return date is
begin
return trunc(add_months(sysdate,-12),'YEAR');
end;
function getLastDayOfLastYear return date is
begin
return trunc(sysdate,'YEAR') - 1;
end;
procedure myProc(
p_start date default getFirstDayOfLastYear,
p_end date default getLastDayOfLastYear
) is
begin
dbms_output.put_line(p_start);
dbms_output.put_line(p_end);
end;
begin
myProc;
end;