首页 > 解决方案 > 使用 SQLLoader 将数据字段的 $ char 替换为零

问题描述

一个文本文件包含如下数据。

    041522$$$$$$$$$NAPTTALIE REVERE @1621500025 OLD ST FUNNRHILL MA1530 273 000000$$$$$$$03@$$$@@@@@@@@@@@@@@@$$$$$ $$$$$$$$$$$$$Z$$$$$$$$$$$$$$$$$$$$$$@@@$$$$$$$$$$$ $$$$$$$$$$@@@@@$$$$$$$$$$$$$$$@$$$$$0$$$$$$$$$$000000$$$ $$$$$$$$$@$$@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@$$$$$ $$$$$$$000000$$$$$$$$$$$$A@@@Y$$$$$$$$$$$$$$1@@$$$$$$$$$$ $$$$$$$$$@@02$$$$$$$$$$$$$@$$$$$$$$$$$$$$$$$$$$$$$@@是@@@@@@@$$$$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

控制文件:

    加载数据
    字符集“UTF8”
    INFILE 'C:\bendex\MA_File38\fileout.txt'
    BADFILE 'C:\bendex\MA_File38\baddata.bad'
    DISCARDFILE 'C:\bendex\MA_File38\discdata.dsc'
    附加
    
    进入表“TMP_DATA_1220”
    尾随 NULLCOLS
    (
    源常数“测试”,
    FILE_DTE "TRUNC(SYSDATE)",
    AU_REGION 位置 (1:2),
    AU_OFFICE 位置 (3:5),
    AU_PGM_CATEGORY 位置 (6) ,
    GRANTEE_SSN 位置 (7:15),
    GRANTEE_NAME POSITION (16:38),
    CAT_ELIG_IND 位置 (39),
    电话位置 (40:47),
    地址位置 (48:70),
    城市位置 (71:83),
    状态位置 (84:85),
    邮编位置 (86:90),
    CAN_NUM 位置 (91:95),
    NET_INC POSITION (96:101) "TO_NUMBER(:NET_INC)",
    START_DTE POSITION (102:107) "CASE WHEN :START_DTE ='$$$$$$' THEN TO_CHAR(REPLACE(:START_DTE, '$', '0')) ELSE DATE 'rrmmdd'",
    LAST_UPDT_UID_NAM 常数 "LOADF38",
    LAST_UPDT_TS "SYSTIMESTAMP"
    )

    **错误:**
    记录 1:已拒绝 - 表“TMP_DATA_1220”中的错误,列 START_DTE。
    ORA-01841: (完整)年份必须介于 -4713 和 +9999 之间,而不是 0

我必须从文本文件中读取数据并加载到表中。我试图用 '0' 替换 '$' 并转换为日期字段,位置 102 到 107,但出现错误。我尝试使用 REPLACE,DECODE 不起作用。

任何帮助深表感谢。谢谢你。

注意:文本文件包含全长数据,但使用 SQL Loader 仅读取前几个数据点。

标签: dateoracle11gsql-loaderctl

解决方案


我相信如果您的开始日期无效,您会希望将其设为 NULL,不是吗?

"CASE WHEN :START_DTE ='$$$$$$' THEN NULL ELSE to_date(:START_DTE, 'rrmmdd') END"

推荐阅读