Sql 从Oracle中提取BLOB
我想从本地数据库导出数据,包含blob的列是bbl_fic 是否可以在不创建包的情况下导出我的数据?只需要一个SQL请求 我不能用C或Java来提取数据,而且我也不知道怎么做 谢谢 数据库可用于导出数据:Sql 从Oracle中提取BLOB,sql,oracle,toad,Sql,Oracle,Toad,我想从本地数据库导出数据,包含blob的列是bbl_fic 是否可以在不创建包的情况下导出我的数据?只需要一个SQL请求 我不能用C或Java来提取数据,而且我也不知道怎么做 谢谢 数据库可用于导出数据: CREATE DIRECTORY export_dir AS '/path/to/your/directory'; 然后使用PL/SQL脚本将所有blob导出到该目录: DECLARE v_start NUMBER(38,0); v_size CONSTANT N
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;
/
数据库可用于导出数据:
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 该工具是用java编写的,可以使用nashorn/javascript引擎等工具进行本地脚本编写。此代码段将执行3列选择。只需标识表PK、要创建的文件名以及要从数据库中提取的BLOB的内容 script命令触发此脚本。我将下面的代码放入一个名为blob2file.sql的文件中 所有这些加起来等于零plsql,零目录,而只是一些混合了javascript的sql脚本
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);
}
/
一种选择是使用SQLcl 该工具是用java编写的,可以使用nashorn/javascript引擎等工具进行本地脚本编写。此代码段将执行3列选择。只需标识表PK、要创建的文件名以及要从数据库中提取的BLOB的内容 script命令触发此脚本。我将下面的代码放入一个名为blob2file.sql的文件中 所有这些加起来等于零plsql,零目录,而只是一些混合了javascript的sql脚本
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);
}
/
我认为在TOAD中,你可以简单地在数据网格上使用鼠标右键并在本地存储文件。我需要制作一个脚本来导出所有数据。我使用的语言只允许我进行循环和执行请求SQL。您可以在这里参考我的答案:我认为在TOAD中,您只需在数据网格上使用鼠标右键并将文件存储在本地。我需要制作一个脚本以导出所有数据。我使用的语言只允许我进行循环并执行请求SQL。您可以在这里参考我的答案:@Y.op我的错误-当我从过程复制开始位置以输出不需要重置的单个blob时,我忘记添加重置开始位置的行。它工作正常。但在900个文件中,我有60个文件未导出,错误消息为file write error。你已经犯了同样的错误?我将它们复制到同一个文件夹中,一个文件重538Ko,名称正确如果我只有对数据库的读取权限而没有创建目录的权限怎么办?我不能这样对我的本地人吗?顺便说一句,我正在Windows上使用Oracle 12c。@Julaayi您无法在本地计算机上创建目录;它是服务器上的一个目录。但是,您可以使用其他工具获取BLOB,例如通过SQL Developer或其他IDE,或者使用Java/C/等编程语言访问数据库。@MT0不幸的是,我没有编程语言方面的经验,我之前尝试过SQL Developer选项,但使用了50多个表,使用SQLDeveloper提取每个对象对我来说真的很难。这就是为什么至少要通过SQL寻找可行的解决方案。我不知道为什么当我可以用SQL Developer执行同样的操作时,我不能运行写入本地的代码。@Y.op我的错误-当我从一个过程复制开始位置以输出一个不需要重置的blob时,我忘了添加一行重置开始位置。它工作正常。但在900个文件中,我有60个文件未导出,错误消息为file write error。你已经犯了同样的错误?我将它们复制到同一个文件夹中,一个文件重538Ko,名称正确如果我只有对数据库的读取权限而没有创建目录的权限怎么办?我不能这样对我的本地人吗?顺便说一句,我正在Windows上使用Oracle 12c。@Julaayi您无法在本地计算机上创建目录;它是服务器上的一个目录。但是,您可以使用其他工具获取BLOB,例如通过SQL Developer或其他IDE,或者使用Java/C/等编程语言访问数据库。@MT0不幸的是,我没有编程语言方面的经验,我之前尝试过SQL Developer选项,但使用了50多个表,使用SQLDeveloper提取每个对象对我来说真的很难。这就是为什么至少要通过SQL寻找可行的解决方案。我不知道为什么我不能运行一个写在本地的代码,而我可以用sqldeveloper做同样的事情。