【问题标题】:How to read CSV data from a Clob column in Oracle using PL/SQL如何使用 PL/SQL 从 Oracle 中的 Clob 列中读取 CSV 数据
【发布时间】:2011-10-21 14:55:49
【问题描述】:

我从一个过程中得到一个 clob 作为参数,它包含一个 CSV 文件。我需要读取这些数据并将其加载到另一个 Oracle 表中。

有人可以解释一下如何做到这一点。

【问题讨论】:

  • 您使用的是什么版本的 Oracle?它可能会对答案产生影响。

标签: sql oracle csv plsql


【解决方案1】:

AFAIK Oracle 对此没有现成的好东西。一个有前途的候选人是DBMS_UTILITY.COMMA_TO_TABLE,但它是heavily limited 用于一项非常特殊的任务,使其无法选择。所以你必须卷起袖子,自己动手做。

您的规范有点模糊,但一个选项是SPLIT 函数:

create table so18t (
  id number,
  csv clob
);

insert all
into so18t values(1,'1,2,3'||chr(10)||
                    '40,5,6'||chr(10)||
                    '700,80,9'||chr(10))
into so18t values(2,'aaa,bbb,ccc'||chr(10)||
                    'ddd,eee,fff'||chr(10)||
                    'ggg,hhh,iii'||chr(10))
select 1 from dual;

declare
  v_lines jh_util.stringlist_t;
  v_values jh_util.stringlist_t;
begin
  for rec in (select * from so18t order by id) loop
    v_lines := jh_util.split(rec.csv, chr(10));
    for i in v_lines.first .. v_lines.last loop
      dbms_output.put_line('line ' || i || ':');
      v_values := jh_util.split(v_lines(i));
      /* Do what you want with the values - I just print them */
      for j in v_values.first .. v_values.last loop
        dbms_output.put_line('v_values(' || j || ') = ' || v_values(j));
      end loop;
    end loop;
  end loop;
end;
/
show errors

打印:

line 1:
v_values(1) = 1
v_values(2) = 2
v_values(3) = 3
line 2:
v_values(1) = 40
v_values(2) = 5
v_values(3) = 6
line 3:
v_values(1) = 700
v_values(2) = 80
v_values(3) = 9
line 1:
v_values(1) = aaa
v_values(2) = bbb
v_values(3) = ccc
line 2:
v_values(1) = ddd
v_values(2) = eee
v_values(3) = fff
line 3:
v_values(1) = ggg
v_values(2) = hhh
v_values(3) = iii

PL/SQL procedure successfully completed.

当然,Oracle 不提供拆分,但 SO helps。在上面的示例中,我使用了自己的。

其他有趣的资源:

【讨论】:

  • 您能否也发布您的 JH_UTIL.SPLIT() 函数?
  • @davor 我不会在这里发布它,但它可以在Bitbucket中找到
【解决方案2】:

不要将数据导出到文件中。

您需要将 clob 转换为有用的东西,解析它,然后写入另一个表。以下是您需要执行的步骤:

  1. 将 Clob 从 Clob 转换为有用的东西。 CLOB.getCharacterStream() 似乎很有用。
  2. 从转换后的 Clob 对象解析 CSV 数据。 CSVReader reader = new CSVReader(the_reader_from_getCharacterStream);ftw
  3. 将所需数据存储在另一个表中。

Oracle's CLOB Object 提供了一些有用的方法。
CSVReader 来自Open CSV

【讨论】:

    【解决方案3】:

    我不知道将 clob 解析为 CSV 的直接方法,但 Oracle 提供了许多用于处理 CSV 文件的工具,例如 External TablesSQL*Loader

    所以一种方法可能是:

    1. 使用DBMS_LOBUTL_FILE 将clob 导出为文件
    2. 使用上述 CSV 工具之一加载文件。

    【讨论】:

      猜你喜欢
      • 2017-12-19
      • 2019-07-05
      • 2011-02-02
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2012-11-16
      • 2013-07-31
      • 1970-01-01
      相关资源
      最近更新 更多