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

1 ... 307 308 309 [ 310 ] 311 312 313 ... 469


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/



1 ... 307 308 309 [ 310 ] 311 312 313 ... 469

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