从 Oracle 中提取 BLOB
extract BLOB from Oracle
我想从本地数据库中导出数据,包含 blob 的列是 "bbl_fic"
。
是否可以在不创建包的情况下导出我的数据?只有一个 SQL
请求?
我无法使用 C#
或 Java
来提取数据,我真的不知道该怎么做。
谢谢!
Create a directory数据库可以用来导出数据:
CREATE DIRECTORY export_dir AS '/path/to/your/directory';
然后使用 PL/SQL 脚本将所有 BLOB
导出到该目录:
DECLARE
v_start NUMBER(38,0);
v_size CONSTANT NUMBER( 5,0) := 32000;
v_len NUMBER(38,0);
v_buffer RAW(32000);
v_file UTL_FILE.FILE_TYPE;
BEGIN
FOR r IN ( SELECT filename, bbl_fic FROM your_table )
LOOP
v_file := UTL_FILE.FOPEN('EXPORT_DIR', r.filename, 'wb', 32760 );
v_start := 1;
v_len := DBMS_LOB.GETLENGTH( r.bbl_fic );
WHILE v_start <= v_len LOOP
DBMS_LOB.READ(
r.bbl_fic,
LEAST( v_len - v_start + 1, v_size ),
v_start,
v_buffer
);
UTL_FILE.PUT_RAW( v_file, v_buffer );
UTL_FILE.FFLUSH( v_file );
v_start := v_start + v_size;
END LOOP;
UTL_FILE.FCLOSE( v_file );
END LOOP;
END;
/
一种选择是使用 SQLcl (http://www.oracle.com/technetwork/developer-tools/sqlcl/overview/index.html)
此工具是用 java 编写的,可以使用诸如 nashorn/javascript 引擎之类的东西来编写本地脚本。此代码段将执行 3 列的 select。 ID 只是 table PK,命名要创建的文件的名称,以及要从数据库中提取的 BLOB 的内容。
脚本命令触发此脚本。我将下面的代码放入名为 blob2file.sql
的文件中
所有这些加起来就是零个 plsql,零个目录而不是一些 sql 脚本和 java 脚本混合在一起。
script
// issue the sql
var binds = {}
var ret = util.executeReturnList('select id,name,content from images',binds);
// loop the results
for (i = 0; i < ret.length; i++) {
// debug is nice
ctx.write( ret[i].ID + "\t" + ret[i].NAME+ "\n");
// get the blob stream
var blobStream = ret[i].CONTENT.getBinaryStream(1);
// get the path/file handle to write to
var path = java.nio.file.FileSystems.getDefault().getPath(ret[i].NAME);
// dump the file stream to the file
java.nio.file.Files.copy(blobStream,path);
}
/
结果是我的 table 清空到文件中(我只有 1 行)
SQL> @blob2file.sql
1 eclipse.png
blob2file.sql eclipse.png
SQL>
我想从本地数据库中导出数据,包含 blob 的列是 "bbl_fic"
。
是否可以在不创建包的情况下导出我的数据?只有一个 SQL
请求?
我无法使用 C#
或 Java
来提取数据,我真的不知道该怎么做。
谢谢!
Create a directory数据库可以用来导出数据:
CREATE DIRECTORY export_dir AS '/path/to/your/directory';
然后使用 PL/SQL 脚本将所有 BLOB
导出到该目录:
DECLARE
v_start NUMBER(38,0);
v_size CONSTANT NUMBER( 5,0) := 32000;
v_len NUMBER(38,0);
v_buffer RAW(32000);
v_file UTL_FILE.FILE_TYPE;
BEGIN
FOR r IN ( SELECT filename, bbl_fic FROM your_table )
LOOP
v_file := UTL_FILE.FOPEN('EXPORT_DIR', r.filename, 'wb', 32760 );
v_start := 1;
v_len := DBMS_LOB.GETLENGTH( r.bbl_fic );
WHILE v_start <= v_len LOOP
DBMS_LOB.READ(
r.bbl_fic,
LEAST( v_len - v_start + 1, v_size ),
v_start,
v_buffer
);
UTL_FILE.PUT_RAW( v_file, v_buffer );
UTL_FILE.FFLUSH( v_file );
v_start := v_start + v_size;
END LOOP;
UTL_FILE.FCLOSE( v_file );
END LOOP;
END;
/
一种选择是使用 SQLcl (http://www.oracle.com/technetwork/developer-tools/sqlcl/overview/index.html)
此工具是用 java 编写的,可以使用诸如 nashorn/javascript 引擎之类的东西来编写本地脚本。此代码段将执行 3 列的 select。 ID 只是 table PK,命名要创建的文件的名称,以及要从数据库中提取的 BLOB 的内容。
脚本命令触发此脚本。我将下面的代码放入名为 blob2file.sql
的文件中所有这些加起来就是零个 plsql,零个目录而不是一些 sql 脚本和 java 脚本混合在一起。
script
// issue the sql
var binds = {}
var ret = util.executeReturnList('select id,name,content from images',binds);
// loop the results
for (i = 0; i < ret.length; i++) {
// debug is nice
ctx.write( ret[i].ID + "\t" + ret[i].NAME+ "\n");
// get the blob stream
var blobStream = ret[i].CONTENT.getBinaryStream(1);
// get the path/file handle to write to
var path = java.nio.file.FileSystems.getDefault().getPath(ret[i].NAME);
// dump the file stream to the file
java.nio.file.Files.copy(blobStream,path);
}
/
结果是我的 table 清空到文件中(我只有 1 行)
SQL> @blob2file.sql
1 eclipse.png
blob2file.sql eclipse.png
SQL>