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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:14:54