PL/SQL基本上对于LONG RAW和BLOB无能为力, 对于这两种需要自已写程序来实现. 在AnySQL中就可以将BLOB的内容转换成LONG RAW, 下面是一个例子. 先来建一张测试表:
ASQL> SET QUERYONLY FALSE
ASQL> CREATE TABLE T_BLOB (ID NUMBER NOT NULL, IMAGE BLOB);Create Table Succeed.
ASQL> VAR P_IMAGE BLOB
ASQL> DEFINE P_IMAGE=ASQL.EXE
ASQL> INSERT INTO T_BLOB VALUES (1, :P_IMAGE);1 rows affected.
ASQL> DEFINE P_IMAGE=ASQLW.EXE
ASQL> INSERT INTO T_BLOB VALUES (2, :P_IMAGE);1 rows affected.
ASQL> commit;
Commit Succeed.
用LOBEXP命令将BLOB中的内容导出成一个个操作系统文件:
ASQL> LOBEXP SELECT 'IMAGE_'||ID||'.EXE', IMAGE FROM T_BLOB;
Write to file: IMAGE_2.EXE , bytes=101376
Write to file: IMAGE_1.EXE , bytes=101376
Command succeed.
将表数据导出, 相应的BLOB字段替换为导出的操作系统文件名:
ASQL> UNLOAD -h off SELECT ID,'IMAGE_'||ID||'.EXE' FROM T_BLOB >> T_BLOB.TXT;
Query executed in 00:00:00.330
2 rows writed in 00:00:00.000ASQL> host cat t_blob.txt
2|IMAGE_2.EXE
1|IMAGE_1.EXE
创建一个LONG RAW的表:
ASQL> CREATE TABLE T_LONGRAW (ID NUMBER NOT NULL, IMAGE LONG RAW);
Create Table Succeed.
创建一个buffer, 结构和导出的文件相同:
ASQL> buffer reset
Command completed.
ASQL> buffer add P_ID INTEGER
Command completed.
ASQL> buffer add P_IMAGE BLOB
Command completed.
用LOAD命令来将数据装载到LONG RAW表中:
ASQL> LOAD INSERT INTO T_LONGRAW VALUES (:P_ID,:P_IMAGE) << T_BLOB.TXT;
Command Completed.
2 rows loaded!
用LOBLEN命令来检查一下装入的LONG RAW字段的长度:
ASQL> LOBLEN SELECT IMAGE FROM T_LONGRAW;
101376,99
101376,99
说明已经成功地将BLOB内容装入到LONG RAW表中, 此例中, 需要将AnySQL的jlib目录下的Oracle JDBC驱动换成10g的版本, 否则不允许更新LOB列.