记一次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>