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

1 ... 394 395 396 [ 397 ] 398 399 400 ... 469


1614

Приложение А

К счастью, эти преобразования легко выполнить. Можно преобразовать:

данные типа BLOB в VARCHAR2;

VARCHAR2 - в RAW;

данные типа LONG - в CLOB;

данные типа LONG RAW - BLOB.

Рассмотрим сначала преобразование типа BLOB в VARCHAR2, и наоборот, а затем разберемся с преобразованиями типов LONG в CLOB и LONG RAW в BLOB.

Преобразование типа BLOB в VARCHAR2 и обратно

В пакет UTL RAW входят две полезные подпрограммы для работы с данными типа BLOB. Более детально пакет UTL RAW мы рассмотрим в соответствующем разделе приложения. Пока речь идет о следующих подпрограммах:

CAST TO VARCHAR2. Принимает данные типа RAW и меняет тип на VARCHAR2.

Никакого преобразования данных фактически не происходит - речь идет только об изменении типа.

CAST TO RAW. Принимает данные типа VARCHAR2 и меняет тип на RAW. И в этом случае данные не изменяются - изменяется только тип данных.

Итак, если известно, что данные типа BLOB содержат текстовую информацию в соответствующей кодировке, эти функции действительно полезны. Используем рассмотренную ранее программу LOADFROMFILE для загрузки набора файлов в столбец типа BLOB. Хотелось бы просматривать значения в этом столбце в среде SQL*Plus (с маскировкой любых недопустимых символов, являющихся причиной некорректной работы программы SQL*Plus). Для этого можно использовать средства пакета UTL RAW. Сначала загрузим ряд файлов в таблицу DEMO:

scott@DEV816> create table demo

2 (id int primary key,

3 theBlob blob

Table created.

scott@DEV816> create or replace directory my files as /export/home/tkyte ; Directory created.

scott@DEV816> create sequence blob seq; Sequence created.

scott@DEV816>create or replace

2 procedure load a file(p dir name in varchar2,

3 p file name in varchar2)

4 as

5 l blob blob;



Пакет DBMS LOB

1615

8 9 10 11 12 13 14 15

16 17 18 19 20 21 22

24 25

26 27 28

29 30 31

l bfile bfile; begin

- Сначала необходимо создать большой объект в базе данных.

- Для загрузки нужен пустой объект типа GLOB, BLOB или большой

- объект, созданный с помощью вызова GREATE TEMPORARY.

insert into demo values (blob seq.nextval, empty blob()) returning theBlob into l Blob;

- Затем открываем файл (объект типа BFILE) ,

- из которого будем загружать данные.

l bfile := bfilename(p dir name, dbms lob.fileopen(l bfile);

p file name);

- После этого вызываем LOADFROMFILE, загружая в только что

- созданный GLOB все содержимое файла (объекта типа BFILE) ,

- который только что открыли. dbms lob.loadfromfile(l blob, l bfile,

dbms lob.getlength(l bfile));

- Закрываем файл (объект типа BFILE) , чтобы

- избежать возможной нехватки дескрипторов файла.

dbms lob.fileclose(l bfile);

end;

Procedure created.

scott@DEV816> exec load a file(MY FILES, clean.sql); PL/SQL procedure successfully completed. scott@DEV816> exec load a file(MY FILES, expdat.dmp); PL/SQL procedure successfully completed.

Итак, я загрузил два файла. Один из них - сценарий, над которым я сейчас работаю, clean.sql. Другой - файл экспорта expdat.dmp, подвернувшийся под руку. Теперь я собираюсь написать функцию, которую можно будет вызывать в SQL-операторах и позволяющую просматривать любой 4000-байтовый фрагмент данных типа BLOB в среде SQL*Plus. Просматривать можно не более 4000 байт, поскольку именно такое ограничение в SQL налагается на размер данных типа VARCHAR2. Представленная ниже функция CLEAN работает аналогично функции SUBSTR для обычной строки, но принимает параметр типа BLOB и необязательные параметры FROM BYTE и FOR BYTES. Это позволяет выбирать и в]давать подстроку объекта типа BLOB. Обратите внимание, как используется функция UTL RAW.CAST TO VARCHAR2 для преобразования типа RAW в тип VARCHAR2. Если не использовать эту функцию, байты данных типа RAW перед помещением в переменную типа VARCHAR2 будут преобразовываться в шестнад-цатеричное представление. С помощью этой функции мы просто меняем тип данных с RAW на VARCHAR2, не выполняя никаких преобразований:



1616

Приложение А

scott@DEV816> create or replace

9 10

12 13

14 15

16 17

18 19 20 21 22

24 25 26 27 28

30 31

34 35 36

40 41 42 43 44 45 46 47 48 49 50 51

function clean(p raw in blob, p from byte in p for bytes in

varchar2

number number

default default

4000)

return as

l tmp

varchar2(8192) default

utl raw.cast to varchar2(

dbms lob.substr(p raw,p for bytes,p from byte) ) ;

l char char(1); l return varchar2(16384); l whitespace varchar2(25) default

chr(13) chr(10) l ws char varchar2(50) default rnt;

chr(9);

begin

i in 1

loop

l char

length(l tmp)

substr(l tmp, i.

Если свол - печатный (а не управляющий) , ничего с н делать не надо. Если это \, добавить еще один свол

- \, поскольку мы будем заменять стволы новой строки и табуляции последовательностями \n, \t и т.д., поэтому

надо различать в файле текст \n и свол новой строки.

between 32 and 127)

l char;

if (ascii(l char) then

l return := l return if (l char = \ ) then l return := l return end if;

- Если свол - пробельный,

- специальным символом типа

заменить его

elsif then

(instr(l whitespace, l char) > 0)

l return := \

l return substr(l ws char,

instr(l whitespace,l char), 1);

Вместо всех остальных непечатн1х просто выдать точку (.).

символов

else

l return end if;

loop;

:= l return



1 ... 394 395 396 [ 397 ] 398 399 400 ... 469

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