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

1 ... 398 399 400 [ 401 ] 402 403 404 ... 469


1626

Приложение А

32003

Hello World Hello World Hello World Hello

PL/SQL procedure successfully completed.

Запись значений объекта типа BLOB/CLOB на диск

Этой возможности в пакете DBMS LOB недостает. Пакет предоставляет средства загрузки больших объектов из файлов, но не создания файла, содержащего большой объект. Решение этой проблемы предложено в главах 18 и 19. Там приведен код на языке С и Java для внешней процедуры, записывающей значение столбца типа BLOB, CLOB в базе данных или временного большого объекта в файл файловой системы сервера. Обе реализации выполняют одну и ту же функцию, просто использованы разные языки. Применяйте ту из них, которая больше подходит для вашего сервера (например, если на сервере не установлена поддержка языка Java, но есть прекомпилятор Pro*C и компилятор языка С, то внешняя процедура на языке С подойдет больше).

Выдача большого объекта на Web-странице с помощью PL/SQL

Представленный ниже пример предполагает, что в системе установлены и работают следующие компоненты:

компонент прослушивания (lightweight listener) WebDB;

сервер приложений OAS 2.x, З.х или 4.x с PL/SQL-картриджем;

сервер iAS с модулем mod plsql.

При отсутствии любого из этих компонентов пример выполнить не получится. В нем используется набор инструментальных средств PL/SQL Web Toolkit (речь идет о широко известных функциях HTP), а также PL/SQL-картридж или модуль.

Предполагается также, что наборы символов (кодировки) на Web-сервере (клиенте сервера базы данных) и в базе данных совпадают. Дело в том, что PL/SQL-картридж или модуль использует для генерации страниц из базы данных тип VARCHAR2. Если набор символов у клиента (в данном случае клиентом является Web-сервер) отличается от набора символов в базе данных, будет выполнено преобразование. При этом обычно повреждаются данные типа BLOB. Предположим, Web-сервер работает на платформе Windows NT. Обычно для клиента на платформе Windows NT используется набор символов WE8ISO8859P1 - западноевропейская 8-битовая кодовая страница. А сервер баз данных работает на платформе Solaris. Стандартной и наиболее типичной кодовой страницей на этой платформе является 7-битовая US7ASCII. При попытке передачи значения BLOB через интерфейс VARCHAR2 в случае использования такой пары кодовых страниц окажется, что старший бит данных из базы сброшен. Данные изменятся. Только если кодировки на клиенте (Web-сервере) и сервере базы данных совпадают, данные передаются без искажений.



Пакет DBMS LOB

1627

Итак, предполагая, что все предварительные условия выполнены, можно рассмотреть использование средств PL/SQL Web Toolkit для выдачи значения BLOB на Web-странице. Продолжим один из предыдущих примеров преобразования, в котором была создана таблица DEMO. Загрузим в нее еще один файл:

ops$tkyte@DEV816> exec load a file(MY FILES, demo.gif);

PL/SQL procedure successfully completed.

Это будет GIF-файл. Теперь необходим пакет, который сможет выбрать это изображение в формате GIF и выдать его на Web-странице. Он может иметь следующий вид:

ops$tkyte@DEV816> create or replace package image get

2 as

3 - Можно задать соответствующее имя процедуры

4 - для каждого типа отображаем1х документов,

5 - например:

6 - procedure pdf

7 - procedure doc

8 - procedure txt

9 - и т.д. Некоторые браузеры (MS IE, напрер) при обработке

10 - документов используют расширения ен файлов,

11 - а не mime-типы

12 procedure gif(p id in demo.id%type);

13 end;

14 /

Package created.

ops$tkyte@DEV816> create or replace package body image get

procedure gif(p id in demo.id%type)

l lob blob;

l amt number default 32000;

l off number default 1;

l raw raw(32000);

begin

- Получить LOB-локатор для

- нашего документа.

select theBlob into l lob

from demo

where id = p id;

- Выдать mime-заголовок для

- документа этого типа.

owa util.mime header(image/gif);

begin

loop

dbms lob.read(l lob, l amt.

l off, l raw);



1628

Приложение А

2 6 - Важно использовать вызов htp.PRN, чтобы избежать

2 7 - добавления в документ ненужных символов

2 8 - перевода строки.

2 9 htp.prn(utl raw.cast to varchar2(l raw));

30 l off := l off+l amt;

31 l amt := 32000;

32 end loop;

33 exception

34 when no data found then

35 NULL;

3 6 end; 3 7 end;

39 end;

40 /

Package body created.

При наличии DAD (Database Access Descriptor - дескриптор доступа к базе данн1х, который обычно создается при настройке PL/SQL-картриджа или модуля) с именем mydata можно использовать адрес URL

http: myhost:myport/pls/mydata/image get.gif?p id=3

для получения изображения. Аргумент P ID=3 передается процедуре image get.gif, требующий от нее выдать локатор большого объекта, который хранится в строке со значением id=3. Это изображение можно включить в страницу с помощью тэга IMG:

<html>

<head><title>3T0 моя страница</title></head> <body>

Это мой GIF-файл

<img src=/img-1/http: myhost:myport/pls/mydata/image get.gif?p id=3>

</body>

</htrol>

Резюме

Большие объекты предлагают намного больше возможностей, чем устаревший тип данных LONG. B этом разделе я ответил на некоторые часто задаваемые вопросы, касающиеся работы с большими объектами. Мы рассмотрели, как загружать большие объекты в базу данных. Мы разобрались, как преобразовать данные типа BLOB в CLOB, и наоборот. Мы выяснили, как эффективно преобразовать все существующие унаследованные данные типа LONG и LONG RAW в типы CLOB и BLOB c помощью невосстановимых и распараллеливаемых действий. Наконец, мы обсудили использование средств PL/SQL Web Toolkit для получения данных типа CLOB или BLOB и отображения их на Web-странице.



1 ... 398 399 400 [ 401 ] 402 403 404 ... 469

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