![]() |
|
Программирование >> Oracle
1344 Глава 18 lines=yes \ lname=lobtofile.pc extproc.so: lobtofile.c lobtofile.o $(MAKE) -f $(MAKEFILE) extproc callback \ SHARED LIBNAME=extproc.so OBJS= lobtofile.o CFIAGS= -g -I. $(INCLUDE) Для ОС UNIX мы сделали такие же изменения, как и в среде Windows. Мы просто добавили команду для вызова прекомпилятора Pro*С и изменили имя компонуемого объектного файла. Набираем команду make и получаем соответствующий .so-файл. Теперь все готово для его проверки и использования. Установка и использование пакета LOB IO Осталось только выполнить операторы CREATE RARY, CREATE PACKAGE и CREATE PACKAGE BODY. При этом пакет LOB IO будет установлен в базе данн1х. Для его тестирования мы используем пару анонимных PL/SQL-блоков. Первый блок будет проверять средства выявления и обработки ошибок. Вызовем внешнюю процедуру и намеренно передадим ей некорректные входные данные, неверные имена каталогов и т.п. Вот этот блок с комментариями, описывающими, что мы должны получить на каждом шаге: SQL> REM для NT SQL> REM задайте PATH=c: \tesap\ SQL> REM задайте CMD=fc /b SQL> REM для UNIX SQL> задайте PATH=/tmp/ SQL> задайте CMD= diff -s SQL> drop table demo; Table dropped. SQL> create table demo(theBlob blob, theClob clob) ; Table created. SQL> /* DOC>* В следующем блоке проверятся вое условия возникновения выявленных DOO * нами ошибок. Не проверяется ошибки ERDR (для этого надо, тобы DOC> * на диске не осталось свободного места или запись б1ла невозможна DOC> * по другой подобной причине) и CONNflidEIDR (это не должно DOC> * случиться *никогда*) DOC>*/ SQL> SQL> declare 2 l blob blob; 3 l bytes number; 4 begin 5 6 /* 7 * Пытаемся передать большой объект NULL Внешние процедуры на языке С 1345 8 / 9 begin 10 l bytes := lob io.write(&PATH, test.dat, l blob); 11 exception 12 when lob io.INVALID LOB then 13 dbms output.put line(недопустимей аргумент перехвачен, -> как и ожидалось); 14 dbms output.put line(rpad(-,70,-)); 15 end; 17 / 18 * Теперь попытаемся передать реальный большой объект и имя -> файла MOLL 19 */ 20 begin 21 insert into demo (theBlob) values(empty blob()) 22 returning theBlob into l blob; 23 24 l bytes := lob io.write(NULL, NULL, l blob); 25 exception 2 6 when lob io.INVALID FILENAME then 27 dbms output.put line(недопустимIй аргумент снова перехвачен, как и ожидалось) ; 2 8 dbms output.put line(rpad(-,7 0,-)); 2 9 end; 31 /* 3 2 * Теперь попытаемся передать существующий большой объект, во -> несуществующий каталог 33 */ 34 begin 35 lbytes := lob io.write(/nonexistent/directory, x.dat, -> l blob); 36 exception 37 when lob io.OPEN FILE ERROR then 38 dbms output.put line(перехватили ошибку открытия файла, -> как и ожидалось); 39 dbms output.put line(sqlerrm); 4 0 dbms output.put line(rpad(-,7 0,-)); 41 end; 42 43 /* 44 * Теперь запишем объект, чтобы проверить работу функции 45 */ 46 l bytes := lob io.write(&PATH, l.dat, l blob); 47 dbms output.put line(Успешно записали lbytes -> байтов); 48 dbms output.put line(rpad(-,70, -)); 50 rollback; 1346 Глава 18 52 /* 53 * Теперь у нас есть непустой большой объект, НО мы ВЫПОЛНИЛИ 54 * откат, так что локатор большого объекта стал недействительны. 55 * Давайте посмотрии, что выдаст внешняя процедура в данной -> случае... 56 V 57 begin 58 l bytes := lob io.write(&PATH, 1.dat, l blob); 59 exception 60 when lob io.LOB READ ERROR then 61 dbms output.put line(перехватили ошибку чтения большого -> объекта, как и ожидалось); 62 dbms output.put line(sqlerrm) ; 63 dbms output.put line(rpad(-,70,-)); 64 end; 65 end; l bytes := lob io.write(&PATH, test.dat, l blob); l bytes := lob io.write(/tmp/, test.dat, l blob); l bytes := lob io.write(&PATH, l.dat, l blob); l bytes := lob io.write(/tmp/, l.dat, l blob); l bytes := lob io.write(&PATH, l.dat, l blob); l bytes := lob io.write(/tmp/, l.dat, l blob); недостимый аргумент перехвачен, как и ожидалось недостимый аргумент снова перехвачен, как и ожидалось перехватили ошибку открытия файла, как и ожидалось ORA-20005: Error opening file ORA-30152: File does not exist Успешно записали 0 байт PL/SQL procedure successfully completed. Как видите, все произошло именно так, как и ожидалось. Мы намеренно сделали несколько ошибок и получили соответствующие сообщения. Теперь используем пакет по прямому назначению. Для этого теста я создал объект-каталог в базе данных, соответствующий моему временному каталогу (/tmp в ОС UNIX, C:\temp\ в Windows). Объект-каталог используется при работе с данными типа BFILE, позволяя читать файлы в указанном каталоге. В файловую систему ОС (/tmp или C:\temp\) я помещу тестовый файл something.big. Это достаточно большой файл для проверки внешней процедуры. Его содержимое не имеет значения. Мы загрузим этот файл в столбец типа B, затем - в столбец типа BLOB и, наконец, во временный большой объект. Затем запишем каждый из этих больших объектов в отдельный файл с помощью созданной внешней процедуры. В завершение с помощью утилит ОС (diff в UNIX и FC в Windows) сравним сгенерированные файлы с исходным: SQL> create or replace directory my files as &PATH.; old 1: create or replace directory my files as &PATH. new 1: create or replace directory my files as /tmp/
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |