2014-11-11 3 views
0

У меня есть функция plsql count_order_cust с тремя параметрами. Но p_start и p_end являются необязательными. Если я вызываю функцию с тремя параметрами, то функция выполняется хорошо, но если я вызываю функцию с одним параметром p_id, то она должна подсчитывать заказы за последний год (то есть 01/янв/2013 - 31/декабрь/2013), и это моя проблема. Как я могу это сделать?Как получить начальную и конечную дату с прошлого года в plsql

Вот функция 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/декабрь/2013 ».

select add_months(sysdate,-12) from dual; 

ответ

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; 
Смежные вопросы