我试图将plsql中的月份和年份作为输入参数传递。如果我传递空值,我希望月份和年份是当前月份和当前年份的默认值。
答案 0 :(得分:1)
DATE 应作为日期传递,而不是部分传递。您可以在需要时提取需求元素。
将 SYSDATE 作为 DEFAULT IN 参数传递:
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
答案 1 :(得分: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;
答案 2 :(得分:0)
您可以按照其他答案中的建议定义参数的默认值。但是这些默认值只有在您不传递任何参数时才会生效。将null作为参数值将不会触发默认值。例如
hist, bin_edges = np.histogram(data,bins)
ax.bar(range(len(hist)),hist,width=1,align='center',tick_label=
['{} - {}'.format(bins[i],bins[i+1]) for i,j in enumerate(hist)])
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;
为11月,选择month=11
会产生select TEST_FN(null) from dual;
。
如果您想使用month=-1
替换null
某个默认值。
答案 3 :(得分: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