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

1 ... 290 291 292 [ 293 ] 294 295 296 ... 469


Внешние процедуры на языке С 1293

файлом операционной системы. Этим файлом операционной системы является созданный нами скомпилированный двоичный файл. Пользователь, выполняющий оператор TE LIBRARY, должен обладать привилегией CREATE LIBRY, предоставленной ему непосредственно или через роль. Эта привилегия считается достаточно мощной и должна предоставляться только тем, кто пользуется доверием. Эта привилегия позволяет пользователям выполнять С-код на сервере с правами той учетной записи, от имени которой работает служба extproc. Это одна из причин, почему необходимо конфигурировать службу extproc так, чтобы она работала не от имени пользователя - владельца программного обеспечения Oracle (чтобы избежать случайного или намеренного переписывания, например, табличного пространства SYSTEM).

Для выполнения этого шага необходимо ввести в среде SQL*Plus команды:

connect scott/tiger Connected.

QI> create or replace library demolib as

2 с:\oracle\plsql\demo\extproc. dll;

Library created.

Имя DEMOLIB выбрано для библиотеки разработчики демонстрационной программа:; имя DEMOLIB использовать обязательно. Имя файла, c:\oracle\pisql\demo\ extproc.dll, может отличаться (я создавал пример непосредственно в демонстрационном каталоге в ORACLE HOME). У вас может отличаться и значение ORACLE HOME;

демонстрационную программу можно создавать вообще в другом каталоге. В операторе создания библиотеки необходимо указать фактическое местонахождение файла extproc.dll, созданного на первом шаге.

Установка и запуск

Последний шаг демонстрации - установка PL/SQL-кода, создающего соответствующие подпрограммы для функций в библиотеке demolib. Нам интересен не столько их исходн1й код, сколько результат их выполнения. Цель демонстрации - протестировать работу внешних процедур. Как их создавать и подключать, мы рассмотрим далее.

Теперь просто выполняем команды:

SQL> connect scott/tiger

Connected.

SQL> @extproc

перейдя предварительно в каталог [ORACLE HOME]\plsql\demo. Вы должны получить примерно следующее:

SQL> @extproc

Package created.

No errors.

Package body created.

No errors.

ENAME : ALLEN

JOB : SALESMAN



1294 Глава 18

SALARY : 1600 COMMISSION : 300

Percent Commission : 18.75

ENAME : MARTIN

JOB : SALESMAN

SALARY : 1250

COMMISSION : 1400

Percent Commission : 112

Return value from CheckEmpName : 0

old ename value on return : ANIL

ENAME : 7369

HIREDATE : 17-DEC-80

Employee Experience Test Passed. ***************************************

PL/SQL procedure successfully completed.

(здесь будут и другие информационные сообщения)!

Это показывает, что внешние процедуры правильно сконфигурированы и могут использоваться в системе. Первая процедура выполняет многие из функций созданной нами библиотеки extproc.dll. Поэтому можно сделать вывод, что все сконфигурировано правильно.

Если система сконфигурирована неправильно, вы скорее всего получите следующее:

SQL> @extproc Package created. No errors.

Package body created. No errors.

BEGIN demopack.demo procedure; END; *

ERROR at line 1:

ORA-28575: unable to open RPC connection to external procedure agent

ORA-06512: at SCOTT.DEMOPACK , line 61 ORA-06512: at SCOTT.DEMOPACK , line 103

ORA-06512: at line 1

Это означает, что надо перечитать представленный ранее раздел Конфигурирование сервера и выполнить все описанные в нем проверки.

Наша первая внешняя процедура

Предполагая, что среда разработки настроена, как описано выше, и готова к использованию внешних процедур, попробуем создать первую собственную внешнюю процедуру. В этом примере мы просто будем передавать переменные различных типов (строки, числа, даты, массивы и т.д.) и рассмотрим, как будет выглядеть соответствующий код на языке С для получения этих значений. Внешняя процедура будет обрабатывать некоторые из этих значений, изменяя значения параметров, переданных в режиме OUT или IN/OUT, в зависимости от значений других параметров, переданных в режиме IN или IN/OUT.



Внешние процедуры на языке С 1295

Я продемонстрирую свой способ сопоставления для этих переменных, поскольку есть много различных вариантов сопоставления и полезных приемов. Я покажу метод, который предпочитаю использовать, несмотря на некоторую избыточность, потому что он обеспечивает максимум информации во время выполнения. Кроме того, я представлю шаблон, по которому я создаю хранимые процедуры. Этот шаблон реализует многие конструкции, необходимые в любом реальном приложении:

Управление состоянием. Внешние процедуры могут потерять информацию о состоянии (текущие значения статических или глобальных переменных). Это связано с реализованным в EXTPROC механизмом кэширования. Поэтому необходимо использовать механизм определения и сохранения состояния в программах на языке С.

Механизме! трассировки. Внешние процедуры выполняются на сервере отдельно от других процессов. Хотя на некоторых платформах эти процедуры можно отлаживать с помощью обычного отладчика, это весьма сложно; если же ошибки возникают только при использовании внешней процедуры одновременно многими пользователями, то просто невозможно. Необходимо средство генерации трассировочных файлов по требованию, начиная с этого момента . Эти файлы аналогичны трассировочным файлам, которые сервер Oracle генерирует при выполнении оператора alter session set sql trace = true; цель их создания - записать данные времени выполнения в текстовый файл для отладки/настройки.

Использование параметров. Необходимо средство параметризации внешних процедур, чтобы можно было управлять их работой извне, с помощью файла параметров, аналогично тому, как файл init.ora используется для управления сервером.

Общая обработка ошибок. Необходимо простое средство выдачи вразумительных сообщений об ошибках пользователю.

Оболочка

Я собираюсь начать с PL/SQL-прототипа. Будут представлены спецификации подпрограмм на PL/SQL, которые планируется реализовать. В этом примере я собираюсь реализовать набор процедур, принимающих параметр в режиме IN и параметр в режиме OUT (или IN/OUT). Мы напишем такую процедуру для каждого существенного (часто используемого) типа данных. На примере этих процедур я продемонстрирую, как правильно передавать входные данные и получать результаты каждого из этих типов. Кроме того, я хочу создать ряд функций, возвращающих результаты некоторых из этих типов. Мне кажется, наиболее существенны следующие типы:

строки (размером вплоть до максимально поддерживаемого языком PL/SQL, 32 Кбайта);

числа (данные типа NUMBER, с любым масштабом и точностью);

даты (DATE);

целые числа (данные типа BINARY INTEGER);



1 ... 290 291 292 [ 293 ] 294 295 296 ... 469

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