14

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

  • 名称 VARCHAR2
  • 数据块

我想将该表导出到可以在另一个系统上导入的 .sql 文件。我尝试使用 Oracle SQL Developer 的“数据库卸载”助手来执行此操作。但是,生成的文件中确实只有名称的内容,但没有数据。因此,在导入之后,我最终会得到所有名称,但数据字段到处都是空的。

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

是否可以使用 SQL Developer 生成这样的脚本?还是有其他方法/工具可以做到这一点?

4

5 回答 5

11

我认为 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 文字”,但由于 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 导入的文本文件中:

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

名称数据
foob​​ar blob_r1_c2.data

连同以下 SQL*Loader 控制文件:

选项(跳过=1)
加载数据字符集 'WE8ISO8859P15'
INFILE 'images.txt'
附加
进入表格图像
由 '\t' 尾随 NULLCOLS 终止的字段
(
  姓名,
  lob_file_data 填充器,
  数据 LOBFILE(lob_file_data) 由 EOF 终止
)

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

更多细节在手册中

编辑

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

于 2012-11-23T15:53:41.103 回答
5

如果您绝对需要使用单个 .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 文件会很大。

于 2013-12-04T14:05:01.383 回答
3

谢谢你的回答。我使用了第三种选择。首先我下载了​​ 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
于 2012-11-27T15:14:10.023 回答
2

这在 SQL 开发人员中绝对是可能的。

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

工具 > 数据库导出

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

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

这是一个更好的解决方案,并且在提取和分发方面是可移植的。它提供了交付组件以通过代码存储库部署的灵活性。

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

使用 Oracle SQL Developer 导出多个 BLOB

于 2017-12-06T17:47:41.330 回答
0

除了 .sql 之外,SQL 工作台还为 blob 数据使用了一种特殊的文件格式。如果你能接受这样的文件,一个更简单的解决方案是使用 Oracle 的Original import and export。(它已被弃用,但与 Oracle 的 DataPump 不同,它不需要服务器上的访问权限。)

这是关于导出部分的一个很好的教程

于 2017-10-06T11:28:52.600 回答