|
Программирование >> Oracle
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
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |