常看到有人问如何更新LOB或LONG类型的字段中的内容, 在SQL*Plus中是不容易的, 在AnySQL小工具中, 除了可以用LOB类型的主机变量, 我设计了LOB和LOBIMP命令来对这些数据类型进行查询操作, 这些命令可以将运行AnySQL的机器(非服务器端)上的文件上传更新到LONG/LOB字段中.

    LOB命令语法, 这里面query应当只返回一行及一列(LONG或LOB类型), 在SELECT中应当加上"FOR UPDATE"子句表示锁定LOB进行更新.

Usage:
  LOB query << file
Note :
  << mean import a file to blob/clob field, the query
     should include the for update clause

    LOBIMP命令语法, 这里面query应当只返回两列, 第一列为文件名, 第二列为LONG或LOB字段, 在SELECT中应当加上"FOR UPDATE"子句表示锁定LOB进行更新.

Usage:
  LOBIMP query
Note :
  Query should return tow column as following:
  col1 : CHAR or VARCHAR specify the filename.
  col2 : blob/clob field.

    下面来看一下例子中用到的表:

ASQL> SELECT FNAME FROM T_LOB;

FNAME
-----
a.txt
otop

2 rows returned.

ASQL> desc t_LOB;

NO# NAME              NULLABLE TYPE        
--- ----------------- -------- ------------
  1 FNAME                      VARCHAR2(20)
  2 FTEXT                      CLOB

    我们将"FTEXT"字段更新成空的CLOB值, 在使用这两个命令时, 要确保LOB字段中的值不为NULL, 如下所示:

ASQL> update t_lob set ftext=empty_clob();

2 rows affected.

ASQL> commit;

Commit Succeed.

    下面用LOB命令来更新一个值:

ASQL> LOB SELECT FTEXT FROM T_LOB WHERE FNAME='a.txt' FOR UPDATE << a.txt;

Command succeed.

ASQL> commit;

Commit Succeed.

    用LOBIMP的例子:

ASQL> LOBIMP SELECT FNAME,FTEXT FROM T_LOB FOR UPDATE;

File a.txt loaded.
File otop loaded.
Command succeed.

ASQL> commit;

Commit Succeed.

    现在检查一下数据库中的值是不是已经被更新了? 这个功能请使用Oracle 10g中带的JDBC驱动(ojdbc14.jar).