Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如果过程中的日期输入参数为空,如何设置其默认值?_Oracle_Date_Stored Procedures_Default Value_Input Parameters - Fatal编程技术网

Oracle 如果过程中的日期输入参数为空,如何设置其默认值?

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

我有一个程序,它接受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;

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

您可以像这样轻松地完成:

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,这很有帮助:)