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

使用SQL Loader导入Oracle表遇ORA-01747错误,求不改列名的解决方法

嘿,这个问题我之前也碰到过!因为你用了Oracle的保留关键字NUMBER作为列名,SQL Loader解析时会把它当成语法关键字而非列名,所以才抛出了ORA-01747错误。不用改列名的话,有两种靠谱的解决办法:

解决SQL Loader导入含保留字列名的Oracle表问题

方法1:在CTL文件中严格使用双引号包裹标识符

你的表是用带双引号的语句创建的(比如"NUMBER"),所以SQL Loader里必须完全匹配这种大小写敏感的引用规则。

给你一个可用的CTL文件示例:

LOAD DATA
INFILE 'your_data_file.csv'  -- 替换成你的数据文件实际路径
INTO TABLE "PWC_IT_SERVICE"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
    "SEQ" INTEGER EXTERNAL,
    "NUMBER" CHAR(10),
    "CI_NAME" CHAR(200),
    "CI_CLASS" CHAR(200),
    "OWNED_BY_PRIMARY" CHAR(200),
    "OWNED_BY_SECONDARY" CHAR(200),
    "MANAGING_TERRITORY" CHAR(200),
    "LOS" CHAR(100),
    "BUSINESS_UNIT" CHAR(100),
    "IMPORTED" DATE "YYYY-MM-DD",  -- 根据你的实际日期格式调整
    "LAST_UPDATED" DATE "YYYY-MM-DD"
)

关键要点:

  • 表名必须用双引号括起来:"PWC_IT_SERVICE",因为建表时用了带引号的标识符(Oracle对带引号的标识符会严格区分大小写)
  • 包括"NUMBER"在内的所有列名,都要用双引号包裹,明确告诉SQL Loader这是一个列标识符,而非关键字

方法2:使用自定义INSERT语句绕开关键字冲突

如果不想修改整个列的引用方式,可以在CTL中指定自定义的SQL子句,把保留字列名用双引号包裹(注意Oracle中字符串里的双引号需要转义成两个双引号)。

示例如下:

LOAD DATA
INFILE 'your_data_file.csv'
INTO TABLE PWC_IT_SERVICE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
    SEQ INTEGER EXTERNAL,
    temp_num CHAR(10),  -- 把数据文件中的字段映射到临时变量
    CI_NAME CHAR(200),
    CI_CLASS CHAR(200),
    OWNED_BY_PRIMARY CHAR(200),
    OWNED_BY_SECONDARY CHAR(200),
    MANAGING_TERRITORY CHAR(200),
    LOS CHAR(100),
    BUSINESS_UNIT CHAR(100),
    IMPORTED DATE "YYYY-MM-DD",
    LAST_UPDATED DATE "YYYY-MM-DD"
)
-- 自定义INSERT语句,用转义的双引号包裹保留字列名
SQL "INSERT INTO ""PWC_IT_SERVICE"" (""SEQ"", ""NUMBER"", ""CI_NAME"", ""CI_CLASS"", ""OWNED_BY_PRIMARY"", ""OWNED_BY_SECONDARY"", ""MANAGING_TERRITORY"", ""LOS"", ""BUSINESS_UNIT"", ""IMPORTED"", ""LAST_UPDATED"") VALUES (:SEQ, :temp_num, :CI_NAME, :CI_CLASS, :OWNED_BY_PRIMARY, :OWNED_BY_SECONDARY, :MANAGING_TERRITORY, :LOS, :BUSINESS_UNIT, :IMPORTED, :LAST_UPDATED)"

关键要点:

  • 把数据文件中对应NUMBER列的内容先映射到一个临时变量(比如temp_num)
  • 在INSERT语句中,用""NUMBER""的形式转义双引号,让Oracle识别这是列名而非关键字

额外提醒

虽然这两种方法能解决当前问题,但还是建议尽量避免用Oracle的保留关键字作为列名或表名——后续的SQL查询、维护都会频繁碰到类似的引号问题,增加不必要的复杂度。

内容的提问来源于stack exchange,提问作者Nandhini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:54:21