将String转换为Date并在给定String无效时引发异常

时间:2012-03-23 09:11:14

标签: sql database oracle plsql

以下是我的代码。我想如果给出的日期不正确,它应该显示一条消息“提供的格式不正确”。

但我无法提出异常 如果使用的异常不正确,我可以在这种情况下使用oracle提供的其他异常吗?

Create or Replace Procedure A1SF_TESTDATE
(
    pDateStr Varchar2
)As
    tDate Date;
    Begin
    tdate := TO_DATE(pDateStr, 'yyyymmdd');
    dbms_output.put_line(tdate);
    Exception 
      When INVALID_NUMBER Then
        dbms_output.put_line('The format provided is incorrect');

End;

1 个答案:

答案 0 :(得分:3)

TO_DATE函数可以抛出许多异常。例子:

  • ORA-01843 - 月份值无效
  • ORA-01847 - 日期值无效
  • ORA-01830 - 日期格式图片在转换整个输入字符串之前结束
  • ...

您可以像以下示例一样捕获它们(只有一个例外):

Create or Replace Procedure A1SF_TESTDATE
(
    pDateStr Varchar2

    -- you must do this for every oracle exception number which will you catch
    bad_month EXCEPTION;
    PRAGMA EXCEPTION_INIT (bad_month, -01843);
)As
    tDate Date;
    Begin
    tdate := TO_DATE(pDateStr, 'yyyymmdd');
    dbms_output.put_line(tdate);
    Exception 
      When bad_month Then
        dbms_output.put_line('The format provided is incorrect');

End;

但为此你必须定义 n pragma!

我更喜欢的解决方案是:

Create or Replace Procedure A1SF_TESTDATE
    (
        pDateStr Varchar2
    )As
        tDate Date;
Begin
        tdate := TO_DATE(pDateStr, 'yyyymmdd');
        dbms_output.put_line(tdate);
        Exception 
          -- every exception will be catched
          When others Then
            dbms_output.put_line('The format provided is incorrect! Because: ' || SQLERRM);

 End;

SQLERRM的可能消息是ORA-01847: day of month must be between 1 and last day of month