2010-05-28 34 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> 
相關問題