0

顶点 3.2 甲骨文 11

我的要求是创建一个允许用户加载 .CSV 文件的 GUI 进程,该文件只有 4 列并且可能有多行。然后用 .CVS 文件中的相应数据更新数据库中的数据表。

CSV file:
ID Number:  Field Name:  Channel:   Analyst:
123456      Title         Retail    John Smith
123456      City          Retail    John Smith


Current DB:
ID Number:  Field Name:  Channel:   Analyst:
123456      Title         Retail    (null)
123456      City          (null)    (null)


After Update DB
ID Number:  Field Name:  Channel:   Analyst:
123456      Title         Retail    John Smith
123456      City          Retail    John Smith

任何想法或链接表示赞赏。

4

1 回答 1

0

提供文件浏览项,将文件上传到 wwv_flow_files。

然后解析BLOB内容,看这个链接:

http://christopherbeck.wordpress.com/2012/04/03/parsing-a-csv-file-in-plsql/

评论也值得一读。例如,提到了 Alexendria PLSQL 实用程序库。这个库包含很多很多基于 plsql 的工具,值得一看!

http://code.google.com/p/plsql-utils/

(引自 Morten 在博客中的评论)

克里斯,

正如我所指出的,最新版本的 csv_util_pkg 包可以在 Alexandria 库中找到,这确实支持可选的封闭值。

我刚刚用您的示例数据对其进行了测试:

 select * from table(csv_util_pkg.clob_to_csv(‘normal,”commas,,,in the
 field”,”"”enclosed”"”,”random “” double “” quotes”,”commas,,, “” and
 double “”"” quotes”‘))

这会将数据分成 5 列:

 c001 = normal c002 = commas,,,in the field c003 = “enclosed” c004 =
 random ” double ” quotes c005 = commas,,, ” and double “” quotes

(我想我应该从博客文章中删除旧代码,并指导人们下载最新的库代码。)

  • 莫腾

此外,在评论中进一步展示了如何从 blob 转到 clob(因此可以使用张贴的方法。感谢 Christopher Beck):

  function blob_to_clob( p_lob in blob ) return clob is
     l_clob_result   clob := 'X';
     l_dest_offsset integer := 1;
     l_src_offsset  integer := 1;
     l_lang_context integer := dbms_lob.default_lang_ctx;
     l_warning      integer;
  begin
     if p_lob is not null and length(p_lob) > 0 then
        dbms_lob.converttoclob(dest_lob     => l_clob_Result,
                               src_blob     => p_lob,
                               amount       => dbms_lob.lobmaxsize,
                               dest_offset  => l_dest_offsset,
                               src_offset   => l_src_offsset,
                               blob_csid    => dbms_lob.default_csid,
                               lang_context => l_lang_context,
                               warning      => l_warning);
        if l_warning != 0 then
           dbms_output.put_line('Function blob_to_clob warning:' || l_warning);
           return null;
        end if;
        return l_clob_result;
     else
        return null;
     end if;
  exception
     when others then
        dbms_output.put_line('Function blob_to_clob error:' || SQLCODE);
        return null;
  end blob_to_clob;

您可以将列输出到全局临时表或集合,然后对此执行更新逻辑。(不过要小心 GTT 和 apex。只要您在同一个会话中就没有问题,但是如果您例如将此作为第二个进程,则不能保证会使用同一个会话!)

于 2012-07-26T07:10:37.873 回答