【问题标题】:How to print record that caused ORA-01843 error?如何打印导致 ORA-01843 错误的记录?
【发布时间】:2018-04-11 12:52:34
【问题描述】:

我有一张包含数百万条记录的表。我正在尝试将一列数据格式化为DATE 格式 目前在VARCHAR2。但是,我收到 ORA-01843 not a valid month 错误。

我正在尝试获取导致 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 错误的记录?

【问题讨论】:

  • 一种方法——相当麻烦——是编写一个函数,一次转换一个值。当不匹配时让它返回NULL,然后在输出中查找NULL 值。
  • 看到填充 v_company 的 SELECT 语句刚刚失败,为什么您希望 v_company 包含任何内容?也许尝试输出 MyColumn?
  • 为什么需要TRIM?该列中的值是否有多余的空格?那么 - 列中字符串的格式是什么?是 YYMMDD 吗?

标签: sql oracle plsql error-handling


【解决方案1】:

我刚刚评论了你之前的问题: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时,你可以使用TO_DATEDEFAULT..ON..CONVERSION ERROR子句

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

一如既往的重要建议,不要在数据库中为DATEs 使用VARCHAR2 / CHAR 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2012-04-05
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多