Oracle:将带有blob的表导出到可以再次导入的.sql文件

时间:2012-11-23 15:03:01

标签: oracle export blob oracle-sqldeveloper

我有一个包含两个字段的表“Images”:

  • 名称VARCHAR2
  • 数据BLOB

我想将该表导出到.sql文件,我可以在另一个系统上导入。我尝试使用Oracle SQL Developer的“数据库卸载”助手来完成此操作。但是,生成的文件只包含其中名称的内容,但不包含数据。因此在导入之后我会得到所有的名字,但数据字段在任何地方都是空的。

我真的更喜欢它只是一个文件(我看到一些例子包括将数据转储到fs上每个字段的一个文件中......)

是否可以使用SQL Developer生成这样的脚本?或者还有其他方法/工具吗?

5 个答案:

答案 0 :(得分:9)

我不认为SQL Developer可以做到这一点(但我不经常使用它)。

我正在使用的SQL客户端 - SQL Workbench/J - 可以做到这一点。

有多种方法可以导出此数据。

生成专有脚本

它可以创建一个使用特殊(特定于工具)表示法引用外部文件的SQL脚本,如:

INSERT INTO images
  (name, data)
VALUES
  ('foobar', {$blobfile='blob_r1_c2.data'});

以上语句只能再次使用SQL Workbench执行。它与任何其他SQL客户端都不兼容。

使用utl_raw

另一种选择是使用“blob literal”,但由于Oracle对字符文字的限制为4000字节,这仅适用于 真正的 小blob值:

INSERT INTO images
  (name, data)
VALUES
  ('foobar', to_blob(utl_raw.cast_to_raw('......')));

其中cast_to_raw调用的字符文字将包含BLOB的十六进制值。因为每个“blob字节”需要2个字符,所以不能处理大于2000字节的BLOB。但是这种语法几乎适用于所有Oracle SQL工具(如果它们可以处理具有很长行的脚本)。

SQL * Loader输入文件

第三种方法是将数据导出到可以使用SQL * Loader导入的文本文件中:

文本文件将包含以下内容:

NAME    DATA
foobar  blob_r1_c2.data

与以下SQL * Loader控制文件一起使用:

OPTIONS (skip=1)
LOAD DATA CHARACTERSET 'WE8ISO8859P15'
INFILE 'images.txt'
APPEND
INTO TABLE IMAGES
FIELDS TERMINATED BY '\t' TRAILING NULLCOLS
(
  NAME,
  lob_file_data FILLER,
  DATA LOBFILE(lob_file_data) TERMINATED BY EOF
)

这可以使用SQL * Loader加载,因此不需要SQL Workbench来导入数据。

手册中有更多详细信息:http://www.sql-workbench.net/manual/command-export.html

修改

正如Alex在评论中指出的那样,您也可以使用DataPump导出 - 但这要求您可以访问服务器上的文件系统。以上解决方案都将数据存储在客户端上。

答案 1 :(得分:2)

谢谢你的回答。我使用了第三种选择。 首先我下载了​​SQL Workbench / J.然后我使用以下命令进行导出:

WbExport -type=text -file='c:\temp\Images' delimiter='|' -decimal=',' -sourcetable=Images -formatfile=oracle;

这产生了一个Images.txt文件和许多Images_r * _c2.data文件和一个Images.ctl文件。

然后我可以使用以下命令导入:

sqlldr myuser@myhost/mypassword control=Images.ctl

答案 2 :(得分:1)

这在SQL开发人员中肯定是可能的。

  • 首先,您需要在源位置选择中导出表格 适当的表格。
  

工具>数据库导出

  • 选择输出格式为loader而不是插入,excel我们 通常使用。

如果您选择了该选项,则执行这些步骤将创建sqlldr控制文件和数据文件以及create table ddl。您可以使用它们在目标中导入(sqlldr)数据

这是一种更好的解决方案,在提取和分发方面具有便携性。它提供了通过代码存储库提供组件的灵活性。

这是一个逐步解释的链接。

Exporting Multiple BLOBs with Oracle SQL Developer

答案 3 :(得分:0)

如果您绝对需要使用单个.sql文件导入BLOB,则可以使用PL / SQL生成脚本:

set serveroutput on
declare
  lob_in blob;
  i integer := 0;
  lob_size integer;
  buffer_size integer := 1000;
  buffer raw(32767);
begin
  select
    data, dbms_lob.getlength(data)
    into lob_in, lob_size
  from images
  where name = 'example.png';

  for i in 0 .. (lob_size / buffer_size) loop
    buffer := dbms_lob.substr(lob_in, buffer_size, i * buffer_size + 1);
    dbms_output.put('dbms_lob.append(lob_out, hextoraw(''');
    dbms_output.put(rawtohex(buffer));
    dbms_output.put_line('''));');
  end loop;
end;

它的输出将是BLOB的内容,编码如下:

dbms_lob.append(lob_out, hextoraw('FFD8FFE0...0000'));
dbms_lob.append(lob_out, hextoraw('00000000...0000'));
...
dbms_lob.append(lob_out, hextoraw('007FFFD9'));

您可以使用PL / SQL加载到已插入的行中:

declare
  lob_out blob;
begin
  select data into lob_out
  from images
  where name = 'example.png'
  for update;

  dbms_lob.append(lob_out, hextoraw('FFD8FFE0...0000'));
  dbms_lob.append(lob_out, hextoraw('00000000...0000'));
  ...
  dbms_lob.append(lob_out, hextoraw('007FFFD9'));
end;

请记住,生成的.sql文件将是巨大的。

答案 4 :(得分:0)

除了.sql之外,SQL workbench还为blob数据使用特殊的文件格式。如果您可以接受此类文件,则更简单的解决方案是使用Oracle的Original import and export。 (它已被弃用,但与Oracle的DataPump不同,它不需要服务器上的访问权限。)

这是一个不错的tutorial on the export part