【问题标题】:I needs to export Oracle BLOB column data to csv or text file我需要将 Oracle BLOB 列数据导出到 csv 或文本文件
【发布时间】:2020-11-22 17:00:01
【问题描述】:

我需要将 Oracle BLOB 列数据导出到 csv 或文本文件。

select Blob1 from table it gives me in binary format.

请给我解决方案,以正常可读格式将 BLOB 数据导出到 csv 或文本文件。

【问题讨论】:

  • @Najdu5,我更新了我的答案,向您展示如何通过输入set long 99999999从sqlplus中的函数获取所有内容

标签: oracle oracle11g blob


【解决方案1】:

通常 BLOB 数据类型用于存储二进制对象,例如图像、视频等。但是,如果您的 BLOB 包含字符而不是二进制数据,则可以执行以下操作:

1.创建一个函数将BLOB返回到CLOB

create or replace function blob_to_char (b blob)
return clob is
  v_clob    clob;
  n         number;
  v_start   pls_integer := 1;
  v_buffer  pls_integer := 32767;
  v_varchar varchar2(32767);
begin
  if (b is null) 
  then
    return null;
  end if;
  if (dbms_lob.getlength(b)=0) 
  then
    return empty_clob();
  end if;
  dbms_lob.createtemporary(v_clob,true);
  for i in 1..ceil(dbms_lob.getlength(b) / v_buffer)
  loop
    v_varchar := utl_raw.cast_to_varchar2(dbms_lob.substr(b, v_buffer, v_start));
    dbms_lob.writeappend(v_clob, length(v_varchar), v_varchar);
    v_start := v_start + v_buffer;
  end loop;
RETURN v_clob;
end blob_to_char;

2.然后您可以在任何选择语句中使用该函数将您的blob恢复为字符串。显然,我假设 BLOB 实际上是一个字符串。

select column1, column2 , blob_to_char(your_blob_column) from your table ;

例子

SQL> create table t ( c1 number, c2 blob );

Table created.


SQL> insert into t values ( 1 , utl_raw.cast_to_raw('ppppppppppppppppppppppppppdoekkkkkkkkkkkkkkkkkkffj') ) ;

1 row created.

SQL> commit;

SQL> create or replace function blob_to_char
  2  ( b blob)
return clob is
  v_clob    clob;
  n         number;
  v_start   pls_integer := 1;
  v_buffer  pls_integer := 32767;
  v_varchar varchar2(327  3  67);
begin
  if (b is null)
  then
  4    5    6    7    8    9   10   11   12      return null;
  end if;
 13   14    if (dbms_lob.getlength(b)=0)
  then
    return empty_clob();
 15   16   17    end if;
  dbms_lob.createtemporary(v_clob,true);
  for i in 1..ceil(dbms_lob.getlength(b) / v_buffer)
  loop
        v_varchar := utl_raw.cast_to_varchar2(dbms_lob.substr(b, v_buffer, v_start));
 18   19   20   21   22         dbms_lob.writeappend(v_clob, length(v_varchar), v_varchar);
        v_start := v_start + v_buffer;
  end loop;
RETURN v_clob;
 23   24   25   26  end;
 27  /

Function created.

SQL> select c1 , blob_to_char(c2) from t ;

        C1
----------
BLOB_TO_CHAR(C2)

--------------------------------------------------------------------------------
         1
ppppppppppppppppppppppppppdoekkkkkkkkkkkkkkkkkkffj

尽管如此,使用 BLOB 存储大量文本或字符串是一种非常糟糕的做法,因为您必须始终使用 CLOB,这正是它的用途。

更新

如果你的 BLOB 很大,尝试将输出增加

 SQL> SET LONG 99999999
 SQL> SELECT blob_to_char(blobcolum) from yourtable ;

【讨论】:

  • 感谢您的帮助,但我的 blob 包含我想以可读格式导出到 csv 文件的二进制数据。
  • 你在 BLOB 中存储了什么??如果是图片,就没有办法了。如果是存储为 blob 的字符串,请使用我提供给您的答案
  • 嗨@Roberto hernandez,它的blob字段只包含xml数据,因为它是字符串,上面的函数工作正常,但它不导出xml选项卡内的内容。
  • 你能发一个例子说明函数不导出 clob 列吗?
  • 例如 xml 包含带有
【解决方案2】:

你不能。 BLOB 是二进制大对象。它可以包含例如图片、音乐文件、视频……

您打算如何将电影导出为 CSV 或文本文件?那你会用它做什么呢?

三思而后行,你似乎有东西错了。

【讨论】:

  • BLOB 列包含二进制格式的 xml 数据,我想将其导出为具有可读格式的任何文件格式。
【解决方案3】:

感谢罗伯托,它就像一个魅力。 SQL> 设置长 99999999 SQL> SELECT blob_to_char(blobcolum) from yourtable ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多