繁体   English   中英

从Oracle提取BLOB

[英]extract BLOB from Oracle

我想从本地数据库中导出数据,包含blob的"bbl_fic"

是否可以不创建包就导出数据? 只需一个SQL请求?

我不能使用C#Java来提取数据,而且我也不知道该怎么做。

谢谢!

一种选择是使用SQLcl( http://www.oracle.com/technetwork/developer-tools/sqlcl/overview/index.html

该工具是用Java编写的,可以使用诸如nashorn / javascript引擎之类的工具进行本地脚本编写。 该代码段将执行3列的选择。 仅对表PK进行ID,对要创建的文件名称进行命名,对要从数据库中提取的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);
}
/

结果是我的表清空到文件中(我只有1行)

SQL>  @blob2file.sql
1   eclipse.png
blob2file.sql   eclipse.png

SQL> 

创建数据库可用于导出数据的目录:

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;
/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM