2010-05-28 37 views
4

有没有将ASCII转换为blob的命令?我想手动将ASCII码流插入到oracle中的BLOB类型的列中

我有如下表:

sample_table: 
------------- 
id : NUMBER 
type : NUMBER 
version : NUMBER 
data : BLOB 

当执行以下命令:

insert into sample_table 
values 
    (1, 0, 1, '<?xml version="1.0" encoding="UTF-8"><Test><buffer><A></buffer></Test>'); 

,我发现了以下错误:ORA-01465: invalid hex number.

+1

不知道你试图做...转换ASCII十六进制什么数字转换为数字字段?示例代码和表定义可能有帮助... – DCookie 2010-05-28 18:02:32

+0

该列是BLOB类型。我想将序列化的XML添加到此列中...类似于插入表名值('xml text'); – 2010-05-28 18:40:51

+0

该号码的OERR解释仅讨论ROWID。在你的情况下,这似乎是相关的。如果没有,我认为你真的需要给我们一些细节。当然你不需要;你可以选择多少重视你接收答案。 – APC 2010-05-28 20:17:21

回答

6

好了,发生了什么是此:

SQL> insert into t42 
    2  (id, version, type, data) 
    3  values (2, 0, 2, '<?xml version="1.0" encoding="UTF-8"><Test><buffer><A></buffer></Test>') 
    4/
    values (2, 0, 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, 0, 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, 0, 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, version, type, xdata) 
    3  values (4, 0, 2, xmltype('<?xml version="1.0" encoding="UTF-8"><Test><buffer><A></buffer></Test>')) 
    4/
    values (4, 0, 2, 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, version, type, xdata) 
    3  values (4, 0, 2, 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> 
相关问题