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