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