如何打印导致ORA-01843错误的记录?

时间:2018-04-11 12:52:34

标签: sql oracle plsql error-handling

我有一张包含数百万条记录的表格。我正在尝试将一个列数据格式化为DATE格式 目前位于VARCHAR2。但是,我得到的ORA-01843不是有效月份错误。

我正在尝试获取导致ORA-01843的记录

CREATE OR REPLACE PROCEDURE pr_TEST_CUSTOM_ORA1843 AS

v_company MyTable.MyColumn%TYPE;

BEGIN
          BEGIN
              SELECT to_char(to_date(TRIM(MyColumn), 'YYMMDD'), 'MM/DD/YYYY') 
              INTO v_company FROM MyTable;    
          EXCEPTION
              WHEN OTHERS THEN
                 DBMS_OUTPUT.PUT_LINE('ORA-01843 caused by'||v_company);
          END;


END  pr_TEST_CUSTOM_ORA1843;

但是,v_company的值不会打印出来。

如何获取导致ORA-01843错误的记录?

1 个答案:

答案 0 :(得分:4)

我刚评论过您之前的问题:How to format only those records for which ORA-01843 is not thrown?但您没有注意它。

创建一个函数,检查它是否是这样的有效日期。

CREATE OR REPLACE FUNCTION validmmddyyyy (p_str IN VARCHAR2)
   RETURN NUMBER
AS
   V_date   DATE;
BEGIN
   V_Date := TO_DATE (p_str, 'MM/DD/YYYY');
   RETURN 1;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN 0;
END;

然后,要选择失败的记录,您可以运行查询

select MyColumn FROM MyTable where validmmddyyyy(MyColumn) = 0

当您足够幸运地使用Oracle 12c R2时,您可以使用DEFAULT..ON..CONVERSION ERROR

TO_DATE子句
SELECT *
  FROM MyTable
 WHERE TO_DATE (MyColumn default null on conversion error,'MM/DD/YYYY') IS NULL

一如既往的重要建议,请勿在数据库中使用VARCHAR2 / CHAR类型的DATE