Программирование >>  Oracle 

1 ... 449 450 451 [ 452 ] 453 454 455 ... 469


Пакет UTL RAW

Пакет UTL RAW поставляется вместе с сервером Oracle, начиная с версии 7.1.6. Этот пакет утилит первоначально создавался командой разработчиков процедурного шлюза Trocedural Gateway) для доступа к данным мейнфреймов и преобразованию их в текстовый вид, впоследствии же был расширен разработчиками средств репликации. Он co-держит четыре часто используемые функции (вы неоднократно встречались с ними по ходу изложения). Я опишу только эти четыре функции, поскольку именно они наибо-лee полезны. В пакете есть и другие функции (еще тринадцать, если быть точным), но я не буду их здесь описывать. Подробнее о них можно прочитать в руководстве Supplied PL/SQL Packages Reference.

Предлагаю вашему вниманию следующие четыре функции:

CAST TO VARCHAR2. Приводит данные типа RAW к типу VARCHAR2.

CAST TO RAW. Приводит данные типа VARCHAR2 к типу RAW.

LENGTH. Возвращает длину переменной типа RAW.

SUBSTR. Возвращает подстроку переменной типа RAW.

Эти функции используются при работе с двоичными данными. Мы использовали их в пакете CRYPTPKG, который рассматривается в разделах приложения А, посвящен-ныx пакетам DBMS OBFUSCATION TOOLKIT, DBMS LOB и UTL TCP.

Начнем с функций CAST . Они меняют значение поля типа переменной RAW на VARCHAR2, и наоборот. При этом содержащиеся в переменной данные не преобразу-юся. Обычно при присвоении значения типа RAW переменной типа VARCHAR2 дли-нa значения переменной типа VARCHAR2 будет в два раза больше, чем значения типа



1780 Приложение

RAW, a само оно будет состоять из шестнадцатиричных цифр. Каждый байт данных типа RAW будет преобразован в шестнадцатиричный вид (это преобразование мы намеренно использовали в процедурах пакета DBMS OBFUSCATION TOOLKIT, например, чтобы выдавать зашифрованные данные на экран в шестнадцатиричном виде). В тех случаях, когда такое преобразование нежелательно, пригодится функция CAST TO VARCHAR2. Чтобы увидеть, что она делает, мы можем воспользоваться SQL-функцией DUMP:

tkyte@TKYTE816> create table t (r raw(10)); Table created.

tkyte@TKYTE816>insert into t values (utl raw.cast tq raw(helloWorld)) ; 1 row created.

tkyte@TKYTE816> select dump(r) rl, dump(utl raw.cast to varchar2(r) ) rl

2 from t;

Rl Rl

Typ=23 Len=10: Typ=l Len=10:

104,101,108,108,111,87,111,114 104,101,108,108,111,87,111,114 ,108,100 ,108,100

Как видно по результату DUMP, единственное, что изменилось в данных - это значение атрибута TYP. Оно изменилось с 23 на 1. Если обратиться к руководству Oracle Call interface Programmers Guide и посмотреть таблицу встроенных типов, можно обнаружить, что значение 23 соответствует типу RAW длинной до 2000 байт, а значение 1 - типу VARCHAR2 длиной до 4000 байт. Функция CAST TO VARCHAR2 просто меняет атрибут типа переменной, данные она не трогает. Именно это и требовалось, когда мы применяли функцию DBMS LOB.SUBSTR к объекту типа BFILE, а в нем оказывался простой текст. Требовалось привести данные типа RAW к типу VARCHAR2 так, чтобы они не преобразовались в шестнадцатиричный вид, т.е. надо б]ло поменять только тип данных.

Функция UTL RAW.CAST TO RAW выполняет обратное действие. При наличии данных типа VARCHAR2, которые необходимо обрабатывать как RAW, она позволит только поменять тип. Мы использовали эту функцию при реализации SIMPLE TCP CLIENT в разделе, посвященном стандартному пакету UTL SMTP. PL/SQL-клиент пос1лает данные типа VARCHAR2, но на уровне языка Java необходимы массивы байтов (данные типа RAW). B языке PL/SQL выполнить соответствующее преобразование очень легко.

Еще две заслуживающие внимание функции - это UTL RAW.LENGTH и UTL RAW.SUBSTR. При передаче данных типа RAW стандартным функциям LENGTH и SUBSTR данные сначала неявно преобразуются в тип VARCHAR2 (в шестнадцатиричное представление). К сожалению, встроенные функции не перегружены и не принимают данные типа RAW: они преобразуют их в VARCHAR2. Это означает, что возвращаемая функцией LENGTH длина будет вдвое больше фактической, а функция SUBSTR будет всегда возвращать шестнадцатиричную строку, причем придется также уточнять значения параметров, задающих смещение и длину подстроки. Функции пакета UTL RAW восполняют этот пробел в функциональных возможностях. Они эквивалентны следующим SQL-операторам:



Пакет UTL RAW 1781

tkyte@TKYTE816> select utl raw.length(r), length(r)/2 from t; UTL RAW.LENGTH(R) LENGTH(R)/2

10 10

tkyte@TKYTE816> select utl raw.substr(r,2,3) rl,

2 hextoraw(substr(r,3,6)) r2

3 from t

R1 R2

656C6C 656C6C

Функции пакета UTL RAW очень упрощают программирование. Вычисление смещений в байтах для стандартной функции SUBSTR выполняется сложнее, и при этом всегда нужно помнить о делении на два.



1 ... 449 450 451 [ 452 ] 453 454 455 ... 469

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика