【问题标题】:Converting a String to Date and raising an exception when given String is invalid将字符串转换为日期并在给定字符串无效时引发异常
【发布时间】:2012-03-23 09:11:13
【问题描述】:

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

但我无法让它引发异常。
使用的异常是否不正确,我可以在这种情况下使用 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;

【问题讨论】:

    标签: sql database oracle plsql


    【解决方案1】:

    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

    【讨论】:

    • @extinguisher33 不客气!解决您的问题后,请接受答案。
    • 如果我希望这是一个函数,以便它以字符串形式返回 DBMS 输出行,需要进行哪些更改?
    • 我想你不想要一个字符串!我想您需要一个可以在函数之外捕获的异常!你如何使用你的功能?在其他函数或 SQL 语句中?
    • 太棒了!我更新了我的转换函数来捕捉日期和年份的异常:bad_month EXCEPTION; PRAGMA EXCEPTION_INIT (bad_month, -01843); bad_day EXCEPTION; PRAGMA EXCEPTION_INIT (bad_day, -01847); bad_year EXCEPTION; PRAGMA EXCEPTION_INIT (bad_year, -01841);
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 2013-07-09
    • 2011-03-26
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多