2015-11-03 101 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 
相关问题