我有一个Procedure,它接受fromDate和toDate输入参数,我需要分别将默认值设置为上个月的第一个日期和上个月的最后一个日期。我正在尝试使用以下代码,但仍未设置正确的默认日期。请让我知道以下代码是否有效,或者我可以采取一些措施予以纠正:
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;
请注意,为简单起见,我仅显示了如何将上个月的第一个日期设置为“从日期”。
答案 0 :(得分:1)
如果要为参数设置默认值,请按照以下示例进行操作:
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.
根据需要,其默认值是上个月的第一天。像这样工作:
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>
请注意,您实际上应该考虑切换到DATE
数据类型参数而不是VARCHAR2
-无论如何,您都在处理日期,所以-为什么要麻烦传递给该过程的无效值?如果它是一个字符串,什么会阻止某人通过例如'99 / 66 / x-FZ'的程序?现在您不必担心,编写异常处理程序...一切都是因为您没有将参数的数据类型设置为DATE
。
答案 1 :(得分:0)
您可以这样轻松得多:
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;
如果您将VARCHAR2
强制使用fromdate_in
,则将值转换为DATE
:
V_date := NVL(TO_DATE(fromdate_in, 'DD/MM/YYYY'), TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM'));