我有一张包含数百万条记录的表格。我正在尝试将一个列数据格式化为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错误的记录?
答案 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
。