Я хочу вручную вставить поток ASCII в столбец типа BLOB в Oracle - PullRequest
4 голосов
/ 28 мая 2010

Есть ли команда, которая преобразует ASCII в 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 Ответ

6 голосов
/ 29 мая 2010

Хорошо, так что происходит, это:

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 - определенно 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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...