如何使用lobs小工具来操作CLOB/BLOB类型值
开发背景
在SQL*Plus中对BLOB/CLOB类型的字段进行操作是不容易的事情,
使用DBMS_LOB这个包时来装载文件到CLOB时需要事先将文件存成UNICODE类型, 否则会出现乱码,
在SQL*Plus中是没有办法将客户端的文件直接装裁到数据库的LOB字段中的, 需要自已写程序.
我在AnySQL这个工具中集成了一些操作LOB类型的工具, 另外还用OCI程序写了一个小工具来操作LOB类型,
工具取名:lobs.
这个工具通过Oracle的客户商软件将本地文件存放到LOB字段中, 或将LOB字段中的值取出来,
存在本地文件. 我已经用二进制文件做过测试, 将二进制文件上传到数据库中, 再取出来存成其他文件名,
新文件仍旧可以执行, 说明程序成功地完成了LOB到本地文件间的转换任务.
命令语法
/****************************************
用法: lobs -u user=... query=...
备注:
-u = 将本地文件装载到数据库中
user = 用户名/口令@Oracle连接字符串
sql = 包括SQL语句的文件, 用于指定复杂的SQL语句
query = SQL语句
****************************************/
将文件装入到数据库的例子
使用这个工具前, 所有要更新的LOB字段不能为空值(Null), 你需要将他们更新成空的LOB值.
在下面的例子中我们要将"a.txt"的文件保存到"T_LOB"的表中, 此表有两个字段"(fname varchar2(20), ftext clob)".
当使用这个功能时, 需要在命令行中指定"-u"选项, 并且在SQL中要指定"FOR UPDATE"来表示对LOB字段作出更新.
SQL语句的第一个字段名应当为文件名(包括路径), 第二个列为BLOB或CLOB类型的列. 按如下步骤进行操作:
a), 创建示例表:T_LOB
SQL> create table t_lob (fname varchar2(20), ftext clob);
b), 插入一个空行, 文件名为"a.txt", LOB字段为空的LOB值.
SQL> insert into t_lob values ('a.txt',empty_clob());
SQL> commit;
c), 编辑"a.txt"
$ ls -l a.txt
-rw-rw-r-- 1 oracle 37 Apr 16 23:09 a.txt
$ cat a.txt
This is lobs sample.
This is line 2.
d), 运行命令来将文件装入到LOB字段中.
$ lobs -u user=user/pass@tns \
query="select fname,ftext from t_lob for update"
Upload file a.txt to LOB field ... Completed.
e), 在SQL*Plus中检查结果
SQL> SELECT DBMS_LOB.GETLENGTH(FTEXT),FNAME FROM T_LOB;
DBMS_LOB.GETLENGTH(FTEXT) FNAME
------------------------- --------------------
37 a.txt
SQL> SELECT FTEXT FROM T_LOB;
FTEXT
--------------------------------------------------------------
This is lobs sample.
This is line 2.
将LOB字段中的值保存为本地文件
这个工具不能处理LOB字段上的空值(NULL), 按下面的例子来进行操作, 比更LOB字段要简单.
第一个字段应当为文件名, 第二个字段应当为BLOB或CLOB字段名.
a), 删除"a.txt"
$ rm a.txt
b), 从LOB字段中读取并存成本地文件.
$ lobs user=user/pass@tns query="select fname,ftext from t_lob"
Export LOB content to file a.txt ... Completed.
c), 检查磁盘上的文件
$ ls -la a.txt
-rw-rw-r-- 1 oracle 37 Apr 16 23:17 a.txt
$ cat a.txt
This is lobs sample.
This is line 2.