如何使用SQL Loader将#,##0.##格式的CSV列加载到数据库表中?
解决SQL Loader加载带千分位格式数字的ORA-01722错误
ORA-01722错误是因为SQL Loader无法直接识别带千分位逗号的字符串为数字类型,需要在加载过程中显式指定格式转换规则,以下是两种可行方案:
方案1:在SQL Loader控制文件中直接转换
在控制文件的字段定义里,使用TO_NUMBER函数配合格式掩码'#,##0.##',将带千分位的字符串转换为NUMBER类型。
示例控制文件内容:
LOAD DATA INFILE 'your_data.csv' INTO TABLE your_target_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ( DEBIT "TO_NUMBER(:DEBIT, '#,##0.##')", CREDIT "TO_NUMBER(:CREDIT, '#,##0.##')", PREVIOUS_BALANCE_AMOUNT "TO_NUMBER(:PREVIOUS_BALANCE_AMOUNT, '#,##0.##')" )
额外处理场景:
- 如果数据包含负号,需调整格式掩码为
'#,##0.##;-#,##0.##' - 如果存在空白或NULL值,用
NVL兜底:"TO_NUMBER(NVL(:DEBIT, '0'), '#,##0.##')" - 如果数据有多余空格,先做修剪:
"TO_NUMBER(TRIM(:DEBIT), '#,##0.##')"
方案2:先加载到临时表再转换
适合需要排查异常数据的场景,先将原始字符串加载到临时表,再批量转换到目标表:
- 创建临时表
CREATE TABLE temp_import ( DEBIT VARCHAR2(50), CREDIT VARCHAR2(50), PREVIOUS_BALANCE_AMOUNT VARCHAR2(50) );
- 编写控制文件加载到临时表
LOAD DATA INFILE 'your_data.csv' INTO TABLE temp_import FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ( DEBIT, CREDIT, PREVIOUS_BALANCE_AMOUNT )
- 转换数据到目标表
INSERT INTO your_target_table (DEBIT, CREDIT, PREVIOUS_BALANCE_AMOUNT) SELECT TO_NUMBER(DEBIT, '#,##0.##'), TO_NUMBER(CREDIT, '#,##0.##'), TO_NUMBER(PREVIOUS_BALANCE_AMOUNT, '#,##0.##') FROM temp_import;
内容的提问来源于stack exchange,提问作者ns102030
相关产品推荐
相关产品推荐

