Oracle Loader外部表加载含双引号特殊CSV文件问题求助
解决Oracle 19c外部表加载带嵌入换行/特殊字符CSV的问题
一、不使用预处理器的ORACLE_LOADER优化方案
如果使用CSV WITH EMBEDDED仍有记录被拒绝,优先检查配置和CSV格式问题,调整外部表脚本如下:
调整后的外部表创建脚本
CREATE TABLE ext_csv_data ( -- 请确保字段数量、类型与CSV列完全匹配 col1 VARCHAR2(100), col2 VARCHAR2(2000), -- 预留足够长度存储带嵌入换行的字段 col3 NUMBER ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY csv_dir -- 替换为你的目录对象 ACCESS PARAMETERS ( RECORDS DELIMITED BY '\n' -- UNIX环境LF换行符 SKIP 1 -- 跳过表头行 BADFILE csv_dir:'ext_csv.bad' LOGFILE csv_dir:'ext_csv.log' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' -- 配合CSV WITH EMBEDDED解析带引号的字段 CSV WITH EMBEDDED -- 启用嵌入换行/逗号的处理 MISSING FIELD VALUES ARE NULL -- 处理缺失字段 REJECT ROWS WITH ALL NULL FIELDS -- 直接跳过全空行 ) LOCATION ('data.csv') -- 替换为你的CSV文件名 ) PARALLEL 1 REJECT LIMIT UNLIMITED;
关键注意事项
- 字段匹配:必须保证外部表的字段数量、顺序与CSV列完全一致,这是字段格式错误的最常见原因。
- CSV格式校验:检查BAD文件中的拒绝记录,重点看是否存在未闭合的双引号(比如某行的字段未用双引号收尾),或者双引号转义错误(标准CSV中引号内的引号需用两个双引号
""表示,而非单个")。 - 换行符设置:UNIX环境下严格使用
'\n'作为记录终止符,不要误用Windows的'\r\n'。 - 字段长度:对于带嵌入换行的字段,需设置足够大的字段长度(比如
VARCHAR2(2000)或CLOB),避免因长度不足被拒绝。
二、Oracle APEX替代方案(APEX_DATA_PARSER包)
如果ORACLE_LOADER仍无法兼容你的CSV格式,可使用Oracle APEX的APEX_DATA_PARSER包,该包对非标准CSV的兼容性更强,支持自动解析嵌入换行、特殊字符。
示例代码(加载至主表)
DECLARE l_parser apex_data_parser.t_parser; l_rows apex_data_parser.t_rows; BEGIN -- 初始化解析器,配置CSV解析规则 l_parser := apex_data_parser.create_parser( p_directory => 'CSV_DIR', -- 替换为你的目录对象 p_file_name => 'data.csv', -- 替换为你的CSV文件名 p_skip_rows => 1, -- 跳过表头 p_csv_options => apex_data_parser.c_csv_option_allow_newlines_in_enclosed_fields -- 允许嵌入换行 ); -- 逐行解析并插入主表 WHILE apex_data_parser.next_row(l_parser, l_rows) LOOP -- 跳过全空行 IF apex_data_parser.row_is_empty(l_rows) THEN CONTINUE; END IF; -- 插入主表,请根据实际列名调整 INSERT INTO main_table (col1, col2, col3) VALUES ( apex_data_parser.get_varchar2(l_rows, 'COL1'), -- 列名区分大小写,需匹配CSV表头 apex_data_parser.get_varchar2(l_rows, 'COL2'), apex_data_parser.get_number(l_rows, 'COL3') ); END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END; /
优势说明
- 自动处理CSV中的嵌入换行、逗号、特殊字符,无需手动配置复杂的加载参数。
- 内置
row_is_empty方法可直接跳过全空行。 - 支持动态识别CSV表头,也可手动指定列映射关系,适配不同格式的CSV文件。
内容的提问来源于stack exchange,提问作者NiCKz
相关产品推荐
相关产品推荐

