记一次ORACLE中BLOB文件直接导出的方法测试

1、准备下环境


下面简单记录一下实现过程。

首先这个是有个前提条件,包含blob的表里得有1个列是写的真实文件名带扩展后缀,要不然导出的文件没法知道是什么类型的文件。比如说你这个列里即有pdf也有word还有jpg或者压缩包啥的有。

实验基础环境准备如下:

1、准备sqldeveloper软件,下最新版本就行,别搞低版本过来。

2、解锁scott用户,创建一张数据表table_log_test(别问我为啥叫这不搭边的名,测试时随便写的),这张表的数据结构如下表所示:

ID

VARCHAR2(20 BYTE)

CONTENT

BLOB

FILE_NAME

VARCHAR2(200 BYTE)

创建完之后,往里面创建两条数据,扔2个Excel文件

3、数据创建成功后,对数据表进行导出,可以选左侧树中找到数据表,右键--导出(根据实际情况,这里你也可以写sql筛选一下,在结果哪里也可以右键导出。)

参照下图配置:

取消“导出DDL”

勾选“导出数据”

格式修改为“loader"

另存为修改为”单独目录“

文件修改为”你要导出存储BLOB的目录“,这里我选择D:lob。

然后点击下一步

继续下一步

点完成导出文件到本地

导出后显示如下目录内容如下

其中”表名xxxx-xxx-xxx.ldr“命名的就是blob文件

其中”表名.ldr"命名的文件就是记录数据表列内容的文件,

其中”表名.ctl"命名的文件就是控制文件,总的来就是sqlloader那一套东西给图形化了,省了不少事。

至此,基本测试环境准备完毕。下面要说的就是两种把blob导出的原始文件变成真实可用的文件。

2、方法1

--方法1,官方文档的方法

说白了就是使用python脚本进行对原始文件重命名,哈哈哈。

唯一坑的地方就是官方文档里贴出来的python脚本没有格式化,完全没法用,我擦。我和大佬研究了半天才用上。

而且官方文档还给了这么一句,大致就是python脚本只用来Demo的。不是产品,不受支持

还给了你另一个选择,就是一会要说的方法2要说到的用SQLCL+JS脚本来执行。

话接回方法1,虽说是Demo,好歹给格式化一下文件啊,给的脚本长这样。。。。。。。,没有缩进空格的脚本粘贴出来根本无法执行啊。

后来大佬给重新加工了一下脚本,改完之后长这样(使用这个得严格按照说明的3列来进行导出,调换顺序名就串了。。。。):

#该脚本是针对3列,序号|原始文件名|真实文件名,顺序不能错 import os <br> zip_location = input("输入目录:") hdr_file_name = input("输入文件名: ") <br> f = open(zip_location+"\"+hdr_file_name, "r") command_string = str(f.readline()).split("{EOL}") #cleaning the command list def command_clean(command_string): for i in command_string: if (i == "" ): command_string.remove(i) <br> #cleaning up file name def clean_file_name(name): name = name.replace('"', "") return name <br> #creating a copy of the specified file and renaming it def copy_rename(file_name, file_to_name): file_path = zip_location + "\" #file location where it will be renamed and stored. os.rename(file_path + file_to_name,file_path + file_name) <br> #extracting and separating the file name and file to be renamed (delimiter is the | symbol) def command_extract(command_string): for s in command_string: sep = s.split("|") cmd1 = sep[2].split("\")[-1] cmd2 = sep[1].strip('"') file_name = clean_file_name(cmd1) copy_rename(file_name,cmd2) command_clean(command_string) command_extract(command_string) print('不报错就成功了') <br>