Oracle 如果过程中的日期输入参数为空,如何设置其默认值?
我有一个程序,它接受fromDate和toDate输入参数,我需要将默认值分别设置为上个月的第一个日期和上个月的最后一个日期。我试图使用下面的代码,但仍然没有设置正确的默认日期。请让我知道以下代码是否有效,或者我可以做些什么来更正它:Oracle 如果过程中的日期输入参数为空,如何设置其默认值?,oracle,date,stored-procedures,default-value,input-parameters,Oracle,Date,Stored Procedures,Default Value,Input Parameters,我有一个程序,它接受fromDate和toDate输入参数,我需要将默认值分别设置为上个月的第一个日期和上个月的最后一个日期。我试图使用下面的代码,但仍然没有设置正确的默认日期。请让我知道以下代码是否有效,或者我可以做些什么来更正它: create or replace PROCEDURE "TEST" ( fromdate_in IN varchar2, todate_in
create or replace PROCEDURE "TEST"
(
fromdate_in IN varchar2,
todate_in IN varchar2,
type_in IN number DEFAULT 01
)
is
V_date varchar2(3000);
begin
select to_date(fromdate_in) into V_date from dual; -- Correct date entered
Exception WHEN Others THEN
select to_char(trunc(trunc(sysdate, 'MM') - 1, 'MM'),'DD/MM/RRRR') into V_date from dual; -- if fromdate_in --is null then set V_date to first date of Previous month
-- calculations using V_date
end TEST;
请注意,为了简单起见,我只展示了如何将上个月的第一个日期设置为起始日期 您可以像这样轻松地完成:
create or replace PROCEDURE "TEST"
(
fromdate_in IN DATE,
todate_in IN DATE,
type_in IN number DEFAULT 1
)
is
V_date DATE;
begin
V_date := NVL(fromdate_in, TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM'));
-- calculations using V_date
end TEST;
SQL> set serveroutput on;
SQL> exec p_test;
fromdate_in = 01/08/2018
PL/SQL procedure successfully completed.
SQL> exec p_test('24/09/2018');
fromdate_in = 24/09/2018
PL/SQL procedure successfully completed.
SQL>
如果您被迫在中对fromdate\u使用VARCHAR2
,则将该值转换为DATE
:
V_date := NVL(TO_DATE(fromdate_in, 'DD/MM/YYYY'), TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM'));
如果要为参数设置默认值,请按照本例中的操作:
SQL> create or replace procedure p_test
2 (fromdate_in in varchar2
3 default to_char(trunc(add_months(sysdate, -1), 'mm'), 'dd/mm/rrrr'))
4 is
5 begin
6 dbms_output.put_Line('fromdate_in = ' || fromdate_in);
7 end;
8 /
Procedure created.
正如您所希望的,它的默认值是上个月的第一天。工作原理如下:
create or replace PROCEDURE "TEST"
(
fromdate_in IN DATE,
todate_in IN DATE,
type_in IN number DEFAULT 1
)
is
V_date DATE;
begin
V_date := NVL(fromdate_in, TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM'));
-- calculations using V_date
end TEST;
SQL> set serveroutput on;
SQL> exec p_test;
fromdate_in = 01/08/2018
PL/SQL procedure successfully completed.
SQL> exec p_test('24/09/2018');
fromdate_in = 24/09/2018
PL/SQL procedure successfully completed.
SQL>
注意,你应该考虑切换到<代码>日期<代码>数据类型参数,而不是<代码> VARCHAR2——无论如何,你都在处理日期,所以为什么要处理传递给过程的无效值?如果它是一个字符串,什么会阻止某人向过程传递,例如“99/66/x-FZ”?现在您必须担心它,编写异常处理程序。。。一切都是因为您没有将参数的数据类型设置为
DATE
为什么要将DATE
值指定为VARCHAR2
?-即使对于TO_DATE()
函数的结果也是如此。拥有VARCHAR2(3000)
的大小是相当夸张的。该过程不接受fromDate和toDate输入参数-它接受两个任意字符串值!是的,VARCHAR2(3000)只是为了测试。我会移除它。我将日期字段定义为varchar,因为它们是作为URL的一部分从UI应用程序传递的。感谢Littlefoot,这很有帮助:)