Oracle APEX按钮上传CSV至表的PL/SQL代码异常修复求助
解决Oracle APEX CSV上传列未拆分问题
从你提供的插入结果来看,所有数据都被解析到了col001中,说明CSV解析时没有正确识别列分隔符,以下是针对性的解决方案:
1. 确认并修正CSV分隔符
最常见的原因是代码中指定的分隔符与实际CSV文件的分隔符不匹配:
- 如果你的CSV文件实际用逗号分隔(比如示例数据
1234,abcd),把代码中的p_csv_col_delimiter参数值从';'改为','即可。
修改后的完整代码:
declare l_file_blob blob; l_file_name BFL_SVC_PROCESS_TRACKER_V24.file_path%type; begin SELECT filename, blob_content INTO l_file_name, l_file_blob FROM APEX_APPLICATION_TEMP_FILES where name = :P401_SOURCE; -- 显式指定目标表列名,避免列顺序问题 insert into a (col001, col002) select col001, col002 from table( apex_data_parser.parse( p_content => l_file_blob, p_add_headers_row => 'Y', p_max_rows => 5, p_skip_rows => 1, p_csv_col_delimiter => ',', -- 修正为实际分隔符 p_store_profile_to_collection => 'FILE_PARSER_COLLECTION', p_file_name => l_file_name ) ) p; commit; end;
2. 处理UTF-8 BOM问题
如果CSV文件是带BOM的UTF-8编码,apex_data_parser可能无法正确识别分隔符,需要先去除BOM再解析:
declare l_file_blob blob; l_clob clob; l_file_name BFL_SVC_PROCESS_TRACKER_V24.file_path%type; begin SELECT filename, blob_content INTO l_file_name, l_file_blob FROM APEX_APPLICATION_TEMP_FILES where name = :P401_SOURCE; -- 检查并移除UTF-8 BOM(EF BB BF) if dbms_lob.getlength(l_file_blob) >= 3 then declare l_bom raw(3); begin dbms_lob.read(l_file_blob, 3, 1, l_bom); if l_bom = hextoraw('EFBBBF') then dbms_lob.trim(l_file_blob, dbms_lob.getlength(l_file_blob) - 3); end if; end; end if; -- 将BLOB转换为CLOB,指定UTF-8字符集 dbms_lob.createtemporary(l_clob, true); dbms_lob.converttoclob(l_clob, l_file_blob, dbms_lob.getlength(l_file_blob), 1, 1, nls_charset_id('UTF8')); insert into a (col001, col002) select col001, col002 from table( apex_data_parser.parse( p_content => l_clob, p_add_headers_row => 'Y', p_max_rows => 5, p_skip_rows => 1, p_csv_col_delimiter => ';', -- 保留实际分隔符 p_store_profile_to_collection => 'FILE_PARSER_COLLECTION', p_file_name => l_file_name ) ) p; commit; dbms_lob.freetemporary(l_clob); end;
3. 先测试解析结果
可以先执行以下代码,在控制台查看解析后的列数据,确认分隔符是否生效:
declare l_file_blob blob; l_file_name BFL_SVC_PROCESS_TRACKER_V24.file_path%type; begin SELECT filename, blob_content INTO l_file_name, l_file_blob FROM APEX_APPLICATION_TEMP_FILES where name = :P401_SOURCE; for r in (select * from table( apex_data_parser.parse( p_content => l_file_blob, p_add_headers_row => 'Y', p_max_rows => 5, p_skip_rows => 1, p_csv_col_delimiter => ',', -- 替换为实际分隔符 p_store_profile_to_collection => 'FILE_PARSER_COLLECTION', p_file_name => l_file_name ) )) loop dbms_output.put_line('col001: ' || r.col001 || ', col002: ' || r.col002); end loop; end;
内容的提问来源于stack exchange,提问作者abi
相关产品推荐
相关产品推荐

