|
Программирование >> Oracle
Внешние процедуры на языке С 1335 У меня есть простой анонимный блок для поочередной проверки каждой из создан-н]х процедур и функций. Я не буду приводить здесь результат выполнения каждой команды. В код демонстрационного примера на сайте издательства включен сценарий test all.sql, выполняющий каждую процедуру и функцию и выдающий результат, подобный представленному выше. После установки можно выполнить его, чтобы увидеть в работе каждую из внешних процедур. Теперь, если вы помните код на языке С, там б1л ряд вызовов debugf. Если после в1полнения представленного выше PL/SQL-блока просмотреть файл ext proc.log во временном каталоге, можно увидеть результаты вызовов debugf. Они будут иметь следующий вид: 000809 185056 GMIT ( extproc.c,176) Входим в функцию Pass Number 000809 185056 GM ( extproc.c,183) Получена среда Oci 000809 185056 GMIT ( extproc.c,176) Входим в функцию Pass Number 000809 185056 GMIT ( extproc.c,183) Получена среда Oci 000809 185056 GMIT ( extproc.c,209) Перв1й параметр: 123 000809 185056 GM ( extproc.c,230) Уcтанавливаем параметр равнгм - 123, а индикаторную переменную - равной NOTNU Это показывает, что 9 августа 2000 года (000809) в 6:50:56 вечера (185056) по Гринвичу (GMT) из строки 176 исходного кода в файле extproc.c был выполнен вызов debugf с сообщением Входим в функцию Pass Number . Далее записаны все остальные выпол-ненн1е вызовы debugf. Как видите, при отладке очень удобно использовать трассировочный файл, запись информации в который можно включать и отключать при необходимости. Поскольку внешние процедуры выполняются на cервере, отладка их может оказаться очень сложным делом. Хотя возможность использовать обычный отладчик не исключена, на практике к ней прибегают очень редко. Внешняя процедура для сброса большого объекта в файл (LOB IO) В Oracle 8.0 появился ряд новых типов данных: CLOB - Character Large Object (символьный большой объект); BLOB - Binary Large Object (двоичный большой объект); BFILE - Binary FILE (двоичный файл). Типы данных CLOB и BLOB позволяют сохранить в базе неструктурированные дан-н1е размером до 4 Гбайт. С помощью данных типа BFILE можно читать файлы ОС, находящиеся в файловой системе сервера. В составе сервера Oracle поставляется пакет DBMS LOB, содержащий много утилит для работы с большими объектами. Он включает даже функцию loadfromfile для загрузки большого объекта из существующего файла ОС. Но в составе сервера Oracle, однако, не поставляется функция для записи большого объекта в файл ОС. Во многих случаях для данных типа CLOB можно использовать средства пакета UTL FILE, но для данных типа BLOB это решение абсолютно не подходит. Сейчас мы займемся реализацией функции для записи в файл данных типа CLOB и BLOB в виде внешней процедуры на языке С, использующей средства прекомпилято-ра Рго*С. 1336 Глава 18 Спецификация пакета LOB IO Снова начнем с оператора CREATE LIBRARY, затем определим спецификацию пакета, потом - тело пакета, задающее соответствующие подпрограммы внешних С-функции, и, наконец, реализуем эти функции на языке С с помощью прекомпилятора Pro*С. Создаем библиотеку в базе данных: tkyte@KYTE816> create or replace library lobToFile lib 2 as C:\extproc\lobtofile\extproc.dll Librarv created. Теперь переходим к спецификации создаваемого пакета. Она начинается с трех регруженн1х функций для записи большого объекта в файл на сервере. Они выз1вают-ся одинаково и возвращают количество байтов, записанных на диск. После спецификаций перечислены исключительные ситуации, которые могут возбуждаться по ходу работа: этих функций. tkyte@TKYTE816> create or replace package lob io 2 as 4 function write(p path in varchar2, 5 p filename in varchar2, p lob in blob) 6 return binary integer; 7 8 function write(p path in varchar2, 9 p filename in varchar2, p lob in clob) 10 return binary integer; 12 function write(p path in varchar2, 13 p filename in varchar2, p lob in bfile) 14 return binary integer; 16 IO ERROR exception; 17 pragma exception init(IO ERROR, -20001); 19 CONNECT ERROR exception; 20 pragma exception init(CONNECT ERROR, -20002); 22 INVALID LOB exception; 23 pragma exception init(INVALID LOB, -20003); 25 INVALID FILENAME exception; 26 pragma exception init(INVALID FILENAME, -20004); 28 OPEN FILE ERROR exception; 29 pragma exception init(OPEN FILE ERROR, -20005); 31 LOB READ ERROR exception; 32 pragma exception init(LOB READ ERROR, -20006); Внешние процедуры на языке С 1337 34 end; 35 / Package created. Здесь мы каждому коду ошибки (эти коды ошибки определены с помощью директив #deJine ERROR в начале файла с исходным текстом внешних процедур) сопоставляем имя исключительной ситуации PL/SQL. Это удобное дополнение, позволяющее пользователю пакета перехватывать исключительные ситуации с определенными именами следующим образом: exception en lob io.IO ERR0R then when lob io.CONNECT ERR0R then при желании получать вместо исключительных ситуаций коды ошибок и тексты сообщений об ошибках: exception when others then if (sqlcode = -20001 ) then - (это была ошибка ввода/вывода) elsif( sqlcode = -20002 ) then - (это была ошибка подключения) ... и так далее Даже не просматривая соответствующий код на языке С, легко понять, какие ошибки могут возникнуть во внешней процедуре Теперь переходим к телу пакета. В нем каждой из представленных выше спецификаций PL/SQL-функций сопоставляется С-функция из библиотеки lobToFile: tkyte@TKYTE816> create or replace package body lob io 2 as 3 4 function write(p path in varchar2, p filename in varchar2, p lob in -> blob) 5 return binary integer 6 as 7 language С name lobToFile library lobtofile lib 8 with context parameters (CONTEXT, 9 p path STRING, p path INDICATOR short, 10 p filename STRING, p filename INDICATOR short, 11 p lob OCILOBLOCATOR, p lob INDICATOR short, 12 RETURN INDICATOR short); 13 15 function write(p path in varchar2, p filename in varchar2, p lob in -> clob) 16 return binary integer 17 as 18 language С name lobToFile library lobtofile lib 19 with context parameters (CONTEXT, 2 0 p path STRING, p path INDICATOR short.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |