Стандартные пакеты. UTL_RAW

dbstalker, 19 июня

Это пакет используется для приведения типов. О нем упоминается в статье про конвертацию большых объектов. Сейчас рассмотрим, как работает пакет с другим типом данных. Рассмотрим основные четыре функции:

  • 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

 

Новый комментарий

Я не спамер: введите суму 4+2



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Досуг для взрослых
19 июня, 1 ответа
авто
19 июня, 1 ответа
Отдых
18 июня, 2 ответа