1

我有一个 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;

请注意,为简单起见,我仅展示了如何将上个月的第一个日期设置为起始日期。

4

2 回答 2

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.

于 2018-09-24T08:11:27.970 回答
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;

如果您被迫使用VARCHAR2forfromdate_in然后将值转换为DATE

V_date := NVL(TO_DATE(fromdate_in, 'DD/MM/YYYY'), TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM'));
于 2018-09-24T06:43:10.267 回答