1. 需求
在服务器2(数据库客户端)上运行一个数据库脚本来操纵在服务器1(数据库服务器)的数据库中的一个BLOB字段,导出这个字段到服务器2的一个文件中。
2. 解决方案
2.1 方案展示图
2.2 步骤
2.2.1 服务器1上
-
在服务器1上建立一个含有blob字段的表。
blob_export(
id number,
photo blob)
-
向该表插入一些blob数据.
-
建立一个服务器1的操作系统目录,比如 '/tmp/tmp/photo_export'
-
利用sshfs把刚建立的目录Mount成服务器2的一个远程目录,比如用如下命令行:
sshfs user@server1:/tmp/photo_export /tmp/tmp/photo_export
注: 在Redhat, 需要用: sudo yum install sshfs
-
在服务器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;
-
创建一个存储过程来实现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
- 在上一节第4步(mount)前,我们需要创建一个操作系统目录,比如'/tmp/photo_export'
-
用如下命令登陆sqlplus.请替换相应部分,比如用户名,密码,服务器地址等。
sqlplus "user/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=server2.xxx.com)(Port=1521))(CONNECT_DATA=(SID=service1)))"
-
在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');
参考
- How To Use SSHFS to Mount Remote File Systems Over SSHhttps://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh
- Extract files from an Oracle BLOB fieldhttp://stackoverflow.com/questions/6332032/how-can-i-extract-files-from-an-oracle-blob-field
-
UTL_FILEhttps://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm
分享到:
相关推荐
1. **安装Oracle Client**:Oracle Client是与Oracle服务器通信的客户端工具,它提供了与数据库交互所需的所有库和驱动程序。安装完成后,我们可以使用SQL*Plus、PL/SQL Developer等工具来连接数据库。 2. **配置...
批量导出BLOB字段的过程通常涉及编写SQL查询或使用PL/SQL过程。这里,我们关注的是通过命令行工具实现自动化。你可以创建一个简单的脚本,输入数据表的名称,以及存储图片文件名和BLOB数据的列名。例如,假设你有一...
这款工具设计的目的是为了帮助用户方便地从Oracle数据库中批量提取并导出Blob字段中的图片至指定的文件夹。 首先,用户需要在运行这个exe可执行文件前确保已安装了Oracle 10g客户端。Oracle 10g客户端是与Oracle...
### Oracle 数据库数据导入导出操作手册解析 #### 手册概述 该操作手册由中科软科技股份有限公司于2019年5月发布,旨在指导数据处理人员如何正确地使用Oracle数据库进行数据导入与导出操作。手册不仅包含了具体的...
1. **使用9.2.0.5版本以上的客户端**:为了规避旧版Oracle 9i客户端在处理BLOB/CLOB字段时可能出现的问题,建议使用9.2.0.5版本以上的客户端进行数据导出。 2. **处理BLOB/CLOB字段**:对于9.2.0.5之前版本的Oracle ...
oracle32位客户端,用于导出oracle中的blob和clob,解决plsql不能导出blob和clob的问题 D:\Programs\app32\exp.exe name/"""password"""@121.32.118.130:1521/dev file=act1.dmp tables=(ACT_GE_BYTEARRAY)
OracleClient.zip是一个包含Oracle数据库客户端软件的压缩包。OracleClient是Oracle公司提供的用于与Oracle数据库交互的工具集,它使得开发者和系统管理员能够在不安装完整Oracle数据库服务器的情况下,连接到远程...
这个组件提供了全面的解决方案,使.NET开发者能够方便、高效地与Oracle数据库进行交互,而无需在目标机器上安装完整的Oracle客户端软件。这极大地简化了部署过程,降低了对系统资源的需求。 ODAC支持多种Oracle...
Oracle JDBC驱动主要有四种类型: Thin、OCI、JDBC-ODBC桥和Universal Driver,其中Thin驱动是纯Java实现,不需要Oracle客户端,适合网络环境,而其他驱动可能需要本地Oracle客户端支持。 当涉及到编辑器内Word特殊...
总结来说,Oracle数据库是一个强大且全面的数据库解决方案,涵盖了从基础数据存储到高级数据库管理的所有方面,广泛应用于企业级信息系统,为企业提供了稳定、高效的数据服务。掌握Oracle数据库的知识对于IT专业人员...
2. **导出的选项**:导出表、导出方案、导出表空间、导出数据库。 3. **导出命令**:使用目录变量与EXPDP命令。 4. **导入命令**:使用EXPDP与IMPDP命令。 #### 选择题知识点 - **导入导出命令的使用**:例如,如何...
本培训材料旨在全面介绍Oracle数据库的相关知识,从基础知识到高级应用均有涉及。通过一系列章节的学习,读者不仅可以掌握Oracle的基本操作,还能深入了解其架构和高级功能,从而更好地利用Oracle解决实际问题。 ##...
Oracle支持多种数据类型,包括数值类型(如NUMBER、INTEGER)、字符类型(VARCHAR2、CHAR)、日期时间类型(DATE)、二进制类型(RAW、BLOB)以及复合和对象类型。选择合适的数据类型能有效节省存储空间,提高查询...
- 导入导出是将数据从一个Oracle数据库迁移到另一个Oracle数据库的过程。 - **工具:** - Oracle Data Pump。 - Oracle EXP/IMP工具。 **7.2 EXP导出数据** - **命令格式:** - `EXP userid=file [FULL|TABLES...
- **Oracle数据类型**:Oracle支持多种数据类型,如NUMBER、VARCHAR2、DATE、BLOB等,以及特有的对象数据类型。 - **创建表和约束**:使用CREATE TABLE语句定义表结构,可以添加各种约束,如NOT NULL、UNIQUE、...
1. **下载与解压**:首先从Oracle官网下载Oracle数据库安装包,并将其解压缩到指定文件夹。 2. **启动安装程序**:运行解压后的`setup.exe`文件来启动安装程序。 3. **配置安装路径**:选择或接受默认的安装路径作为...
1. 安装Oracle客户端,并配置好数据库连接信息。 2. 导出数据库的几种方式: - 导出整个库:`exp 用户名/密码@数据库服务名 file=文件路径.log=log=日志路径.log` - 不包含数据导出:`... rows=n` - 导出单个表:...
将数据库的BLOB栏位直接导出,或者将外部文件直接导入到BLOB栏位中。 可以根据文件内容修改数据库数据,或者把数据库中的数据作为新的栏位添加到文件中而形成新的文件 将SQL的执行结果导出为Excel格式,TEXT格式,...