如何在pl sql的输入参数中传递当前月份和年份?

时间:2015-11-03 10:51:58

标签: oracle plsql oracle11g

我试图将plsql中的月份和年份作为输入参数传递。如果我传递空值,我希望月份和年份是当前月份和当前年份的默认值。

4 个答案:

答案 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