You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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:先加载到临时表再转换

适合需要排查异常数据的场景,先将原始字符串加载到临时表,再批量转换到目标表:

  1. 创建临时表
CREATE TABLE temp_import (
  DEBIT VARCHAR2(50),
  CREDIT VARCHAR2(50),
  PREVIOUS_BALANCE_AMOUNT VARCHAR2(50)
);
  1. 编写控制文件加载到临时表
LOAD DATA
INFILE 'your_data.csv'
INTO TABLE temp_import
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
  DEBIT,
  CREDIT,
  PREVIOUS_BALANCE_AMOUNT
)
  1. 转换数据到目标表
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 21:22:38