19июн
Стандартные пакеты. UTL_RAW
Это пакет используется для приведения типов. О нем упоминается в статье про конвертацию большых объектов. Сейчас рассмотрим, как работает пакет с другим типом данных. Рассмотрим основные четыре функции:
- FUNCTION cast_to_raw
- FUNCTION cast_to_varchar2
- FUNCTION length
- FUNCTION substr
FUNCTION cast_to_raw(c IN VARCHAR2 CHARACTER SET ANY_CS) RETURN RAW – функция меняет тип переменной varchar2 на raw , само содержимое и длина переменной остаётся неизменными
FUNCTION cast_to_varchar2(r IN RAW) RETURN VARCHAR2 – функция меняет тип переменной raw на varchar2, само содержимое и длина переменной остаётся неизменными.
Давайте посмотрим на примере
SQL> drop table dbst_t;
Table dropped.
SQL> create table dbst_t ( r raw(10) );
Table created.
SQL> insert into dbst_t values ( utl_raw.cast_to_raw('helloWorld' ) );
1 row created.
SQL> select dump(r) r1 from dbst_t;
R1
----------------------------------------------------------------------------------------
Typ=23 Len=10: 104,101,108,108,111,87,111,114,108,100
SQL> select dump(utl_raw.cast_to_varchar2(r)) r1 from dbst_t;
R1
----------------------------------------------------------------------------------------
Typ=1 Len=10: 104,101,108,108,111,87,111,114,108,100
Пример нас убеждает в том, что данные не меняются, меняется только атрибут типа переменной.
Есть ещё две очень полезные функции для работы с данными типа raw:
FUNCTION length(r IN RAW) RETURN NUMBER
FUNCTION substr(r IN RAW,pos IN BINARY_INTEGER,len IN BINARY_INTEGER
DEFAULT NULL) RETURN RAW;
Зачем они нужны, если есть стандартные length и substr? Дело в том, что эти стандартные функции сначала преобразуют данные в тип varchar2 , а затем уже выполняют свои обязанности. То есть длина всегда будет в два раза больше. Поэтому есть смысл их использовать для типа raw. Посмотрите на примеры, и вам все станет ясно.
SQL> select utl_raw.length(r), length(r)/2 from dbst_t;
UTL_RAW.LENGTH(R) LENGTH(R)/2
----------------- -----------
10 10
SQL> select utl_raw.substr(r,2,3) r1 from dbst_t;
R1
----------------------------------------------------------
656C6C
SQL> select hextoraw(substr(r,3,6)) r2 from dbst_t;
R2
------
656C6C