如何使用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.