Можете ли вы предоставить пример utl_raw.convert + utl_raw.cast_to_varchar2? - PullRequest
0 голосов
/ 11 июля 2020

Может кто-нибудь, пожалуйста, скажите мне, как utl_raw.convert работает с utl_raw.cast_to_varchar2 в Oracle 11g, предоставив образец кода, поскольку я не могу найти пример использования в Интернете.

Спасибо, Гаутам

1 Ответ

0 голосов
/ 11 июля 2020

UTL_RAW.CONVERT - это функция для преобразования необработанных данных из одного набора символов в другой набор символов, возвращая результат как исходный.

Итак, функции допускают 3 параметра:

  • Необработанный файл, который вы хотите преобразовать
  • Назначение набора символов
  • Источник набора символов

UTL_RAW.CAST_TO_VARCHAR2 преобразует необработанную строку в тип данных varchar2.

Давайте проверим

Мои настройки: Oracle 11g Набор символов базы данных: UTF-8

SQL> create table test_raw ( c1 raw(256) ) ;

Table created.

SQL>  insert into test_raw select UTL_RAW.CAST_TO_RAW ( '123009988poee' ) from dual ;

1 row created.

SQL> insert into test_raw select UTL_RAW.CAST_TO_RAW ( 'üäöüöä' ) from dual ;

1 row created.

SQL> commit ;

Commit complete.

SQL> select * from test_raw ;

C1
--------------------------------------------------------------------------------
313233303039393838706F6565
EFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD

SQL> select utl_raw.cast_to_varchar2 ( a.c1 ) from test_raw a ;

UTL_RAW.CAST_TO_VARCHAR2(A.C1)
--------------------------------------------------------------------------------
123009988poee
????????????

Здесь мое представление второго необработанного файла неточно, так как я нужно в первую очередь cast_to_raw. Если вы этого не сделаете, вы получите ORA-O1465: недопустимое шестнадцатеричное число.

SQL> select utl_raw.cast_to_varchar2 ( utl_raw.convert ( utl_raw.cast_to_raw ( a.c1 ) , 'we8mswin1252' , 'al32utf8' ) ) as result
  2  from test_raw a ;

RESULT
--------------------------------------------------------------------------------
313233303039393838706F6565
EFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD

Используйте также функцию dump () для исследования байтовых значений, составляющих строку. Таким образом вы можете определить, состоит ли строка из правильных значений.

SQL> select dump ( utl_raw.cast_to_varchar2 ( utl_raw.convert ( utl_raw.cast_to_raw ( a.c1 ) , 'we8mswin1252' , 'al32utf8' )  ) ) as dump_result
from test_raw a

RESULT
--------------------------------------------------------------------------------
Typ=1 Len=26: 51,49,51,50,51,51,51,48,51,48,51,57,51,57,51,56,51,56,55,48,54,70,
54,53,54,53

Typ=1 Len=72: 69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,
66,68,69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68,69
,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68


SQL> select dump ( c1 ) from test_raw ;

DUMP(C1)
--------------------------------------------------------------------------------
Typ=23 Len=13: 49,50,51,48,48,57,57,56,56,112,111,101,101
Typ=23 Len=36: 239,191,189,239,191,189,239,191,189,239,191,189,239,191,189,239,1
91,189,239,191,189,239,191,189,239,191,189,239,191,189,239,191,189,239,191,189
...