是否有将ASCII转换为blob的命令?
我有下表:
sample_table: ------------- id : NUMBER type : NUMBER version : NUMBER data : BLOB
执行以下命令时:
insert into sample_table values (1,1,'<?xml version="1.0" encoding="UTF-8"><Test><buffer><A></buffer></Test>' );
我收到以下错误:ORA-01465:无效的十六进制数.
解决方法
好的,所发生的事情是这样的:
SQL> insert into t42
2 (id,version,type,data)
3 values (2,2,'<?xml version="1.0" encoding="UTF-8"><Test><buffer><A></buffer></Test>')
4 /
values (2,'<?xml version="1.0" encoding="UTF-8"><Test><buffer><A></buffer></Test>')
*
ERROR at line 3:
ORA-01465: invalid hex number
SQL>
这是因为您在二进制字段中插入ASCII文本.二进制字段需要十六进制字符,例如<. ?,=等不是十六进制.您需要做的是将其转换为十六进制,如下所示:
SQL> insert into t42
2 values (2,utl_raw.cast_to_raw('<?xml version="1.0" encoding="UTF-8"><Test><buffer><A></buffer></Test>'))
3 /
1 row created.
SQL> select * from t42
2 /
ID TYPE VERSION
---------- ---------- ----------
DATA
--------------------------------------------------------------------------------
2 0 2
3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223E3C5465
73743E3C6275666665723E3C413E3C2F6275666665723E3C2F546573743E
SQL>
这很容易,因为我使用的是Oracle 11g.如果您使用的是更早版本的Oracle – definitley 8,可能是9 – 那么您可能需要使用两步过程.首先插入一个这样的标记:
SQL> insert into t42 2 values (1,empty_blob()) 3 / 1 row created. SQL>
然后,您可以像这样填充BLOB列:
SQL> declare
2 b blob;
3 begin
4 b := utl_raw.cast_to_raw(rpad('FF',32767,'FF'));
5 update t42
6 set data = b
7 where id = 1;
8 end;
9 /
PL/SQL procedure successfully completed.
SQL> select * from t42
2 /
ID TYPE VERSION
---------- ---------- ----------
DATA
--------------------------------------------------------------------------------
1 0 1
46464646464646464646464646464646464646464646464646464646464646464646464646464646
46464646464646464646464646464646464646464646464646464646464646464646464646464646
SQL>
顺便提一下,如果你要存储XML数据,为什么要将它存储为BLOB而不是作为字符数据(CLOB)或从9i开始存储本机XMLType类型?好吧,不使用XMLType的一个原因是你的文本不是格式良好的XML,但我认为这只是一个疏忽;)
SQL> alter table t42 add xdata xmltype;
Table altered.
SQL> insert into t42
2 (id,xdata)
3 values (4,xmltype('<?xml version="1.0" encoding="UTF-8"><Test><buffer><A></buffer></Test>'))
4 /
values (4,xmltype('<?xml version="1.0" encoding="UTF-8"><Test><buffer><A></buffer></Test>'))
*
ERROR at line 3:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00254: invalid XML declaration
Error at line 1
ORA-06512: at "SYS.XMLTYPE",line 310
ORA-06512: at line 1
SQL> insert into t42
2 (id,xmltype('<?xml version="1.0" encoding="UTF-8"?><Test><buffer>A</buffer></Test>'))
4 /
1 row created.
SQL> select * from t42
2 /
ID TYPE VERSION
---------- ---------- ----------
DATA
--------------------------------------------------------------------------------
XDATA
--------------------------------------------------------------------------------
4 2 0
<?xml version="1.0" encoding="UTF-8"?><Test><buffer>A</buffer></Test>
SQL>