我有一个包含两个字段的表“Images”:
我想将该表导出到.sql文件,我可以在另一个系统上导入。我尝试使用Oracle SQL Developer的“数据库卸载”助手来完成此操作。但是,生成的文件只包含其中名称的内容,但不包含数据。因此在导入之后我会得到所有的名字,但数据字段在任何地方都是空的。
我真的更喜欢它只是一个文件(我看到一些例子包括将数据转储到fs上每个字段的一个文件中......)
是否可以使用SQL Developer生成这样的脚本?或者还有其他方法/工具吗?
答案 0 :(得分:9)
我不认为SQL Developer可以做到这一点(但我不经常使用它)。
我正在使用的SQL客户端 - SQL Workbench/J - 可以做到这一点。
有多种方法可以导出此数据。
它可以创建一个使用特殊(特定于工具)表示法引用外部文件的SQL脚本,如:
INSERT INTO images
(name, data)
VALUES
('foobar', {$blobfile='blob_r1_c2.data'});
以上语句只能再次使用SQL Workbench执行。它与任何其他SQL客户端都不兼容。
另一种选择是使用“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导入的文本文件中:
文本文件将包含以下内容:
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
)数据
这是一种更好的解决方案,在提取和分发方面具有便携性。它提供了通过代码存储库提供组件的灵活性。
这是一个逐步解释的链接。
答案 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。