加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门站长网 (https://www.0592zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我想手动将ASCII流插入到oracle中BLOB类型的列中

发布时间:2021-02-19 04:29:51 所属栏目:百科 来源:网络整理
导读:是否有将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"TestbufferA/buffer/Test

是否有将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>

(编辑:厦门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!