【问题标题】:Converting an Oracle Stored Procedure DATE Input Parameter转换 Oracle 存储过程 DATE 输入参数
【发布时间】:2018-03-23 23:16:29
【问题描述】:

我是 Oracle 的新手,对存储过程的输入参数有疑问。基本上它是从外部系统调用的存储过程,传递格式为 MM/DD/YYYY 的日期。

Oracle 似乎不喜欢 MM/DD/YYYY 格式,因为它给了我一个“不是有效月份”的错误。 (我认为它想要像 DD-MMM-YYYY 一样?)无论默认是什么。

有没有办法在日期进入程序时转换它而不会出错?

如:

    create procedure test_proc
(
 v_input_date IN DATE := to_char(v_input_date, 'MM/DD/YYYY')
)

我知道上面的代码可能没有实际意义,但希望它能传达我想做的事情。用户会调用类似的过程

BEGIN
test_proc('01/01/2018')
END

【问题讨论】:

    标签: oracle plsql date-conversion


    【解决方案1】:

    您可以尝试使用 ANSI 类型 date 'yyyy-mm-dd' 格式,如下例所示:

    SQL>create or replace procedure test_proc( v_input_date date ) is
      v_diff int;
    begin
      v_diff := trunc(sysdate)-v_input_date;
      dbms_output.put_line(v_diff||' days difference...');
    end;
    /
    
    SQL> set serveroutput on;
    SQL> begin
      test_proc(date '2018-03-21');
    end;
    /
    2 days difference...
    

    【讨论】:

    • v_diff := trunc(sysdate)-v_input_date; 更短更快。
    • 非常感谢!我能够使用您在输入字符串中建议的日期 (test_proc(date '2018-03-21');) 和 yyyy-mm-dd 准确地执行我需要的操作。现在让呼叫系统以这种格式发送它:).....再次感谢!
    【解决方案2】:

    您的问题不在程序中,而在调用该程序的代码中。

    '01/01/2018' 不是日期,而是字符串,但您的程序需要一个日期;但是,Oracle 会尽力提供帮助,并会隐式尝试使用 TO_DATE( string_value, format_model ) 函数将字符串转换为日期。由于它没有指定的格式模型,它将使用日期的默认格式NLS_DATE_FORMAT session parameter,如果此格式掩码与字符串的格式不匹配,则会出现错误。

    (注意:会话参数是每个用户会话的,并且可以由每个用户更改,因此您不应依赖它们对于每个用户都是相同的,甚至在同一用户的会话之间也是相同的! em>)

    您可以使用查询查看NLS_DATE_FORMAT 会话参数的格式:

    SELECT VALUE
    FROM   NLS_SESSION_PARAMETERS
    WHERE  PARAMETER = 'NLS_DATE_FORMAT';
    

    您调用该过程的代码被隐式转换为:

    BEGIN
      test_proc(
        TO_DATE(
          '01/01/2018',
          ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
        )
      );
    END;
    

    要生成日期,您应该通过以下方式将字符串显式转换为日期:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 2013-02-06
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多