Как установить значение по умолчанию для входного параметра даты в процедуре, если они нулевые? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть Процедура, которая принимает входные параметры 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;

Обратите внимание, я показал только, как я устанавливаю для первого дня предыдущего месяца значение С даты для простоты.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Если вы хотите установить значение по умолчанию для параметра, сделайте так, как в этом примере:

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 datatype вместо VARCHAR2 - вы все равно имеете дело с датами, поэтому - зачем беспокоиться о том, что недопустимые значения передаются впроцедура?Если это строка, что помешает кому-то передать, например, '99 / 66 / x-FZ 'в процедуру?Теперь вы должны позаботиться об этом, написать обработчик исключений ... все, потому что вы не установили тип данных параметров в DATE.

0 голосов
/ 24 сентября 2018

Вы могли бы сделать это намного проще, как это:

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'));
...