代码之家  ›  专栏  ›  技术社区  ›  user2488578

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

  •  3
  • user2488578  · 技术社区  · 7 年前

    我有一张有数百万条记录的表格。我正在尝试将一列数据格式化为 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 回复  |  直到 7 年前
        1
  •  4
  •   Kaushik Nayak    7 年前

    我刚刚对你之前的问题发表了评论: 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 数据库中的。