2015-11-03 19 views
1

我想在plsql中將月份和年份作爲輸入參數傳遞。如果我傳遞空值,我希望月份和年份是當前月份和當年的默認值。如何在pl sql的輸入參數中傳遞當前月份和年份?

+1

你可以用'to_char'功能。例如'to_char(sysdate,'yyyy')' - 這將是年。但它將是char值 – Tatiana

+3

爲什麼你將月份和年份作爲單獨的參數傳遞,而不是日期?你可以通過本月的第一天(例如'trunc(sysdate,'mm')')而不是需要兩個單獨的參數。這有好處是已經有了驗證,以確保你不會通過一個月的13等 – Boneist

+1

我同意@Boneist。日期應該作爲日期傳遞,而不是部分傳遞。您可以根據需要提取需求元素。 –

回答

1

A 日期應作爲日期傳遞,而不是部分傳遞。您可以在需要時按要求提供元素。

傳遞SYSDATE默認情況下參數:

p_date DATE default SYSDATE 

然後EXTRACT元素:

例如,

SQL> SELECT SYSDATE , 
    2 EXTRACT(YEAR FROM SYSDATE) AS curr_year , 
    3 EXTRACT(MONTH FROM SYSDATE) AS curr_month , 
    4 EXTRACT(DAY FROM SYSDATE) AS curr_day 
    5 FROM dual; 

SYSDATE CURR_YEAR CURR_MONTH CURR_DAY 
--------- ---------- ---------- ---------- 
03-NOV-15  2015   11   3 

根據您的需求,你可以使用TO_CHAR,但是,結果的數據類型將是字符串

例如,

SQL> SELECT SYSDATE , 
    2 TO_CHAR(SYSDATE, 'YYYY') AS curr_year , 
    3 TO_CHAR(SYSDATE, 'MM') AS curr_month , 
    4 TO_CHAR(SYSDATE, 'DD') AS curr_day 
    5 FROM dual; 

SYSDATE CURR_YEAR CURR_MONTH CURR_DAY 
--------- --------- ---------- -------- 
03-NOV-15 2015  11   03 
0

第一變體 -

CREATE OR REPLACE PROCEDURE test_poc(
    year_num IN NUMBER DEFAULT to_number(to_char(sysdate, 'yyyy')), 
    month_num IN NUMBER DEFAULT to_number(to_char(sysdate, 'mm'))) IS 
BEGIN 
    .... 
END; 

二(較好,在輸入參數的日期) -

CREATE OR REPLACE PROCEDURE test_poc(date_in IN DATE) IS 
    year_num NUMBER; 
    month_num NUMBER; 
BEGIN 
    year_num := to_number(to_char(nvl(date_in, sysdate), 'yyyy')); 
    month_num := to_number(to_char(nvl(date_in, sysdate), 'mm')); 
    ... 
END; 
0

您可以定義默認您的參數如其他答案中的建議。但是這些默認值只有在不傳遞任何參數時纔會生效。賦予null作爲參數值不會觸發默認值。例如

create or replace 
function TEST_FN(p_month in number default extract(MONTH from sysdate)) 
return varchar2 
as 
begin 
    return 'month='||nvl(p_month, -1); 
end; 

select TEST_FN() from dual;將導致month=11十一月,並選擇給出select TEST_FN(null) from dual;month=-1

如果您想用一些默認值替換null使用nvl(...)

0
create or replace procedure p1(my_year int default null, my_month integer default null) 
as 
    lyear int := nvl(my_year, to_char(sysdate,'yyyy')); 
    lmonth int := nvl(my_month, to_char(sysdate,'mm')); 
begin 

    dbms_output.put_line(lyear); 
    dbms_output.put_line(lmonth); 
end; 

測試

begin 
p1; 
p1(2010); 
p1(null,12); 
p1(2009,10); 
end; 

輸出

2015 
11 
2010 
11 
2015 
12 
2009 
10 
相關問題