Московский государственный университет имени М.В.Ломоносова
Опубликован: 05.01.2004 | Доступ: свободный | Студентов: 9476 / 1246 | Оценка: 4.04 / 3.84 | Длительность: 10:03:00
ISBN: 978-5-94774-539-9
Лекция 13:

Объектно-ориентированное программирование в PL/SQL

< Лекция 12 || Лекция 13: 123 || Лекция 14 >

Внешние процедуры

Использование внешних процедур значительно расширяет функциональность сервера, предоставляя интерфейс для вызова программ, разработанных на других языках программирования, таких как C++ или Pascal, и созданных как DLL-библиотеки.

Во время выполнения блока PL/SQL динамически загружается DLL-библиотека и происходит вызов внешней процедуры как подпрограммы PL/SQL. Внешние процедуры всегда выполняются в отдельном процессе.

Вызовы внешних процедур можно выполнять из:

  • анонимных блоков PL/SQL;
  • методов, объявленных в объектном типе ;
  • хранимых или пакетных подпрограмм ;
  • триггеров базы данных;
  • SQL-операторов, вызываемых только для пакетных подпрограмм.

Для применения внешней процедуры следует сначала определить используемую DLL-библиотеку, выполнив оператор CREATE LIBRARY library_name {IS | AS} 'file_path';. Затем необходимо зарегистрировать внешнюю процедуру, указав в процедуре PL/SQL, используемой для опосредованного вызова внешней процедуры, место расположения процедуры, способ ее вызова и список передаваемых параметров.

Если DLL-библиотека c_lib.dll содержит функцию f1_ext, которая определена в С как int c_ext_f1(int x_val, int y_val);, то подпрограмма PL/SQL reg_ext_f1, выполняющая регистрацию этой внешней процедуры, может быть записана следующим образом:

CREATE FUNCTION reg_ext_f1(
   x BINARY_INTEGER, y BINARY_INTEGER)
   RETURN BINARY_INTEGER AS EXTERNAL
   LIBRARY c_lib
   - Имя внешней функции
   NAME "c_ext_f1"
   LANGUAGE C;

Для вызова внешней функции DLL-библиотеки из анонимного блока PL/SQL достаточно выполнить вызов функции PL/SQL, зарегистрированной как внешняя функция.

Например:

DECLARE
   var1 BINARY_INTEGER;
   x BINARY_INTEGER;
   y BINARY_INTEGER;
BEGIN
x:=1; y:=2;
- Вызов внешней функции f1_ext:
   var1 := reg_ext_f1(x, y);
END;
< Лекция 12 || Лекция 13: 123 || Лекция 14 >