文档章节

从Oracle导出BLOB(方案1:客户端)

w
 waking999
发布于 2017/05/24 13:31
字数 595
阅读 35
收藏 0

1. 需求

在服务器2(数据库客户端)上运行一个数据库脚本来操纵在服务器1(数据库服务器)的数据库中的一个BLOB字段,导出这个字段到服务器2的一个文件中。
2. 解决方案

2.1 方案展示图

2.2 步骤

2.2.1 服务器1上

  1. 在服务器1上建立一个含有blob字段的表。

    blob_export(
    id number,
    photo blob)


  2. 向该表插入一些blob数据.

  3. 建立一个服务器1的操作系统目录,比如 '/tmp/tmp/photo_export'

  4. 利用sshfs把刚建立的目录Mount成服务器2的一个远程目录,比如用如下命令行:

    sshfs  user@server1:/tmp/photo_export /tmp/tmp/photo_export

    注: 在Redhat, 需要用: sudo yum install sshfs

  5. 在服务器1建立一个数据库的directory,关联到刚创建的本地操作系统目录。比如'LOCAL_PHOTO_EXPORT_2' 到 '/tmp/tmp/photo_export'

    CREATE OR REPLACE DIRECTORY LOCAL_PHOTO_EXPORT_2 AS '/tmp/tmp/photo_export';
    GRANT all ON DIRECTORY LOCAL_PHOTO_EXPORT_2 TO user;

  6. 创建一个存储过程来实现blob导出,代码如下:

    create or replace PACKAGE BODY FILE_TRANSFER AS  
      PROCEDURE REMOTE_BLOB_EXPORT(P_LOCAL_DIRECTORY in varchar2) AS
        l_id number;
        l_photo_len number;
        l_photo blob;
     
        l_file      UTL_FILE.FILE_TYPE;
        l_buffer    RAW(32767);
        l_amount    BINARY_INTEGER := 32767;
        l_pos       NUMBER := 1;
     
        c_photo_ext varchar2(5);
        l_file_name varchar2(30);
        BEGIN
          c_photo_ext :='.png';
     
     
          for rec in
            (
            
            select * from blob_export
            )
          loop
              l_id:=rec.id;
              l_photo:=rec.photo;
              l_photo_len := DBMS_LOB.getlength(l_photo);
     
              l_file_name := to_char(l_id)||c_photo_ext;
     
              --open file
              l_file := UTL_FILE.fopen(P_LOCAL_DIRECTORY,l_file_name,'wb',32767);
     
              --write file
              WHILE l_pos < l_photo_len LOOP
                DBMS_LOB.read(l_photo, l_amount, l_pos, l_buffer);
                UTL_FILE.put_raw(l_file, l_buffer, TRUE);
                l_pos := l_pos + l_amount;
              END LOOP;
     
              -- Close the file.
              UTL_FILE.fclose(l_file);
          end loop;
        END REMOTE_BLOB_EXPORT;
     
     
    END FILE_TRANSFER;


2.2.2 在服务器2

  1. 在上一节第4步(mount)前,我们需要创建一个操作系统目录,比如'/tmp/photo_export'
  2. 用如下命令登陆sqlplus.请替换相应部分,比如用户名,密码,服务器地址等。

    sqlplus "user/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=server2.xxx.com)(Port=1521))(CONNECT_DATA=(SID=service1)))"


  3. 在sqlplus执行blob导出的存储过程。

    execute   file_transfer.remote_blob_export('LOCAL_PHOTO_EXPORT_2');


扩展

判断文件是否存在

<span style="font-size:14px;">function is_file_exist(p_local_directory in varchar2, p_file_name in varchar2)
    return char
    as
    l_exists boolean;
    l_file_len number;
    l_block number;
    begin
      UTL_FILE.FGETATTR(p_local_directory, p_file_name,l_exists,l_file_len,l_block);
      if l_exists=true then
        return 'Y';
      else
        return 'N';
      end if;
    end is_file_exist;</span>

select file_transfer.is_file_exist('LOCAL_PHOTO_EXPORT_2','a.png') from dual;


删除文件
<span style="font-size:14px;">procedure remove_file(p_local_directory in varchar2, p_file_name in varchar2)
   as
   begin
     if is_file_exist(p_local_directory, p_file_name)='Y' then
      utl_file.fremove(p_local_directory,p_file_name);   
     end if;
   end remove_file;</span>

execute   file_transfer.remove_file('LOCAL_PHOTO_EXPORT_2','a.png');

 

 

参考

  1. How To Use SSHFS to Mount Remote File Systems Over SSH https://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh
  2. Extract files from an Oracle BLOB field http://stackoverflow.com/questions/6332032/how-can-i-extract-files-from-an-oracle-blob-field
  3. UTL_FILE https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm





本文转载自:http://blog.csdn.net/kswaking/article/details/52787984

w
粉丝 0
博文 23
码字总数 0
作品 0
澳大利亚
私信 提问
sqlldr 导入乱码,Oracle客户端字符集问题

1,查Oracle数据库创建时候的字符集: Oracle服务器端执行 SQL> select name, value$ from sys.props$ where name like 'NLS%'; NAME VALUE$ ------------------------------ --------------......

Primaries
2013/03/01
408
0
十二、oracle 数据库(表)的逻辑备份与恢复

一、介绍 逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程。 逻辑恢复是指当数据库对象被误操作而损坏后使用工具import利用备份的文件把数据对象导入到数据库的过程。 物...

openlife
2015/07/07
89
0
DBeaver 1.4.5 发布,数据库管理客户端

DBeaver 1.4.5 版本增加对 MySQL 和 Oracle 的本地客户端支持,支持 MySQL 的完整数据库导入和导出,更新了结果集过滤UI,改进了驱动管理,多语言的安装程序等等。 DBeaver 是一个通用的数据...

红薯
2011/11/28
715
1
oracle 备份恢复 08逻辑备份恢复

一、逻辑备份相关设置 1.逻辑备份主要是编码格式设置 export ORACLE_SID= export NLS_LANG= select PROPERTYNAME,PROPERTYVALUE from database_properties; 二、EXP/IMP客户端工具导出导入实...

PeakFang-BOK
2018/10/14
7
0
WIN7 64位系统,Oracle 11g 64位,没法使用PL/SQL Developer导出数据

WIN7 64位系统,Oracle 11g 64位,无法使用PL/SQL Developer导出数据 本帖最后由 tsmmst 于 2013-05-17 11:06:16 编辑 用pl/sql登陆数据库后,点击Tools——Export Tables后,弹出一个备份数...

cccyb
2016/11/28
39
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部