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

Oracle 如何在pl sql的输入参数中传递当前月份和年份?,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我试图在plsql中传递月份和年份作为输入参数。如果传递空值,我希望月份和年份成为当前月份和当前年份的默认值。A日期应作为日期传递,而不是部分传递。您可以在需要时提取需求元素 将SYSDATE作为参数中的默认值传递: p_date DATE default SYSDATE 然后提取元素: 比如说, SQL> SELECT SYSDATE , 2 EXTRACT(YEAR FROM SYSDATE) AS curr_year , 3 EXTRACT(MONTH FRO

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

A日期应作为日期传递,而不是部分传递。您可以在需要时提取需求元素

SYSDATE作为参数中的默认值传递:

p_date DATE default SYSDATE
然后提取元素:

比如说,

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
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
根据您的要求,您可以使用来_CHAR,但是,结果的数据类型将是string

比如说,

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
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
第一种变体-

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;
第二个(更好,输入参数中有日期)——


您可以按照其他答案中的建议为参数定义默认值。但这些默认值只有在您不将任何内容作为参数传递时才会生效。将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;
A
从dual中选择TEST_FN()将导致11月的
month=11
,并从dual中选择
select TEST_FN(null)给出
月份=-1

如果要用一些默认值替换
null
,请使用
nvl(…)

试验

输出

2015
11
2010
11
2015
12
2009
10

您可以使用
来创建char
函数。e、 g.
到字符(sysdate,'yyyy')
-这将是一年。但这很重要,为什么要将月份和年份作为单独的参数传递,而不是日期?您可以只通过当月的第一个参数(例如,
trunc(sysdate,'mm')
),而不需要两个单独的参数。这样做的好处是已经进行了验证,以确保您不会超过13个月,etcI同意@Boneist。日期应作为日期传递,而不是部分传递。您可以根据需要提取需求元素。
2015
11
2010
11
2015
12
2009
10