Oracle Magazine - Русское издание (Декабрь 2007)

Игорь Мельников,
Oracle СНГ,
ведущий специалист по технологиям Oracle GRID

Разработка .NET-хранимых процедур для Oracle10g Database for Windows.
(Профессионалу-разработчику)

Источник: сайт Realcoding.NET "Программирование для всех", http://www.realcoding.net/article/view/4106

СОДЕРЖАНИЕ


Введение

Признавая популярность платформы Microsoft .NET среди разработчиков приложений на платформе Windows, Oracle Corporation, начиная с версии 10g Rel.2 интегрировала .NET CLR в свою СУБД. Теперь разработчики приложений для Oracle Database for Windows могут создавать хранимые процедуры в виде сборок .NET. Интеграция с CLR предлагает множество выгод разработчикам приложений для Oracle Database:

  • Стало возможным, для разработки серверной бизнес-логики базы данных, использовать любой язык программирования .NET Framework. Теперь разработчики не ограничены только PL/SQL и Java Stored Procedure.
  • Дополнительно к увеличению производительности разработчика, компании также выиграют, так как разработчики на платформе .NET могут разрабатывать логику приложения базы данных без необходимости изучать специализированный язык PL/SQL.
  • Разработчики приложений теперь могут выбрать - они могут развернуть логику приложения в слое базы данных, в среднем слое, или на компьютере клиента.
  • Платформа .NET имеет в своем составе мощную библиотеку классов. Разработчики баз данных могут увеличить свою продуктивность, используя эту библиотеку. Не требуется создавать собственные библиотеки с "нуля", как это часто происходит в случае с PL/SQL. Дополнительно, на рынке имеется большое количество готовых .NET-компонентов - они также могут быть использованы при создании .NET -хранимых процедур в Oracle Database.

В настоящей статье будет рассмотрены следующие практические вопросы:

  1. Установка и конфигурирование Oracle Database 10g Rel.2 для выполнения .NET-хранимых процедур
  2. Создание .NET-хранимых процедур в среде MS Visual Studio 2005 и .NET Framework 2.0
  3. Публикация хранимых процедур .NET в среду выполнения на сервер Oracle Database
  4. Вопросы отладки и распространения .NET-хранимых процедур из среды разработки в промышленную среду

Теория

Рассмотрим технологию создания и выполнения .NET-хранимых процедур. Ключевым инструментом для создания .NET-хранимых процедур является Oracle Developer Tools for .NET [ODT .NET] - представляет собой набор свободно доступных инcтрументов разработчика для платформы .NET. В состав ODT .NET входят подключаемые модули (plug-ins) к средам разработки Microsoft Visual Studio .NET 2003/2005. ODT .NET позволяет, наряду с разработкой .NET-хранимых процедур, также создавать клиентские приложения работающие с СУБД Oracle Database. Для взаимодействия с базами данных Oracle используются механизмы ADO .NET.
В случае если для выполнения приложений используется окружение NET Framework версии 1.1, то для разработки используется MS Visual Studio 2003 и ADO .NET 1.1. Если же приложения планируется выполнять в окружении .NET Framework версии 2.0 - для разработки используется MS Visual Studio 2005 и ADO .NET 2.0.

Для трансляции высокоуровневых вызов ADO .NET в "родные" (native) низкоуровневые вызовы Oracle Call Interface, корпорация Oracle поставляет свой собственный провайдер ADO DB .NET. В составе клиентского программного обеспечения Oracle Database 10g Rel.2 Client поставляется два провайдера доступа - для версий ADO .NET 1.1 и ADO .NET 2.0.

Для выполнения хранимых процедур, реализованных в сборках .NET, на сервере базы данных, предназначен компонент Oracle Database Extensions for .NET [ODE .NET]. Указанный компонент входит в дистрибутив Oracle Database 10.2.0 for Windows.


Рис.1 Поддержка технологий .NET в Oracle Database for Windows

Установка

Установка Oracle Database

Прежде всего, необходимо отметить тот очевидный факт, что возможность создания .NET-хранимых процедур возможна только для Oracle Database на платформе MS Windows. Поддержка выполнения .NET-хранимых процедур доступна во всех редакциях СУБД Oracle: начиная от бесплатной версии (Express Edition) и заканчивая корпоративной редакцией (Enterprise Edition).

Для включения возможности выполнения .NET-хранимых процедур, при установке программного обеспечения Oracle Database 10g Rel.2 for Windows, в списке компонентов необходимо выбрать Oracle Database Extensions for .NET.


Рис.2 Выбор установки ODE.NET в среде Oracle Universal Installer

    Установка ODE .NET 10.2.0.2

Следующим шагом, для включения поддержки .NET Framework версии 2.0 в .NET-хранимых процедурах, нужно установить обновление (patch) ODE .NET 10.2.0.2. ODE .NET 10.2.0.2 входит в состав Oracle Developer Tools for .NET.

Загрузить ODT .NET можно с сайта Oracle Technology Network по следующему адресу: /technology/software/tech/dotnet/utilsoft.html

При установке обновления ODT .NET 10.2.0.2, в списке компонентов необходимо выбрать Oracle Database Extensions for .NET


Рис.3 Выбор Oracle Database Extensions for .NET при установке ODT .NET
Нужно обратить внимание, что ODE .NET необходимо устанавливать в тот же каталог, в который установлен Oracle Database.


Рис.4 Выбор при установке ODE 10.2.0.2, каталога с установленной Oracle Database
Далее, следует выбрать: с помощью какой версии .NET Framework будут созданы и будут далее выполняться .NET-хранимые процедуры.


Рис.5 Выбор версии .NET Framework для выполнения .NET-хранимых процедур
После установки обновления ODE .NET 10.2.0.2, в среде SQL*Plus следует скомпилировать новую версию пакета DBMS_CLR, с помощью следующего набора команд:

SQL> connect / as sysdba
SQL> @?/rdbms/admin/dbmsclr.plb

Установка Oracle Developer Tools Установка Oracle Developer Tools for Visual Studio .NETУстановка Oracle Developer Tools Для поддержки процесса разработки .NET-хранимых процедур, необходимо установить подключаемый модуль, входящий в состав ODT .NET, к среде MS Visual Studio.
В случае установки Oracle Developer Tools for Visual Studio .NET на машине с уже установленной Oracle Database, ODT .NET необходимо установить в отдельный каталог (ORACLE_HOME).

Oracle Developer Tools for Visual Studio .Net, также как и ODE .NET, входит в состав Oracle Developer Tools for .NET 10.2.0.2.


Рис.6 Установка Oracle Developer Tools for Visual Studio .NET
На следующем шаге необходимо выбрать набор компонентов для соответствующей версии MS Visual Studio .NET:


Рис.7 Выбор компонентов для MS Visual Studio .NET 2005

Конфигурирование

Процесс настройки ПО Oracle Database для выполнения .NET-хранимых процедур состоит из двух шагов:

  • установки ключей реестра для соответствующего ORACLE_HOME;
  • настройки прослушивающего процесса Oracle Listener.

    Настройка реестра MS Windows

Для определения версии .NET Framework, которая будет использоваться при создании и выполнении .NET-хранимых процедур, необходимо вручную создать строковый ключ реестра с именем ".NETFramework" в разделе:

"HKEY_LOCAL_MACHINESOFTWAREORACLEKEY_(HOMENAME)ODE"
Где: HOME_NAME - внутреннее имя для домашнего каталога, в который установлено ПО Oracle Database.

Значения ключа ".NET Framework" могут быть следующими:

  • v1.0.3705
  • v1.1.4322
  • v2.0.50727

Рис.8 Определение версии .NET Framework 2.0 для выполнения .NET-хранимых процедур
На Рис.8 приведен пример определения Net Framework версии 2.0 в качестве среды выполнения .NET-хранимых процедур.

Настройка сетевого прослушивающего процесса Oracle Listener

В случае создания сетевого прослушивающего процесса с помощью Net Configuration Assistant, файлы listener.ora и tnsnames.ora создаются автоматически, но также их можно создать и вручную.

Содержимое файла listener.ora (ПО Oracle Database в данном случае установлено в каталог c:oracleproduct10.2.0db) должно иметь следующий вид:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = c:oracleproduct10.2.0db)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = c:oracleproduct10.2.0db)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = mypc)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

Содержимое файла tnsnames.ora должно включать в себя два алиаса:

ORACLR_CONNECTION_DATA и EXTPROC_CONNECTION_DATA:

ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

В заключение, необходимо убедиться, что запущены два сервиса, которые необходимы для выполнения .NET-хранимых процедур:

  • Oracle(KEY_NAME)ClrAgent
  • Oracle(KEY_NAME)TNSListener


Рис.9 Для выполнения .NET-хранимых процедур на сервере должны быть запущены сервисы TNSLlistener и CLRAgent

Создание .NET-хранимых процедур в среде MS Visual Studio 2005 и .NET Framework 2.0

В данном разделе будет рассмотрен процесс создания и выполнения .NET-хранимых процедур с помощью среды разработки MS Visual Studio 2005 и среды выполнения .NET Framework 2.0.
После установки ODT .NET в среде MS Visual Studio 2005 доступен новый шаблон проекта "Oracle Projects".


Рис.10 Выбор шаблона проекта "Oracle Project" в среде MS Visual Studio 2005

После выбора шаблона проекта "Oracle Project", автоматически генерируется следующий шаблон кода (используется язык программирования C#):
  using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Data;
  using Oracle.DataAccess.Client;
  using Oracle.DataAccess.Types;

 namespace OraNetSPSample1
{
     public class  public static void StoredProcedure1()
        {
          // enter you code here
        }
    }
}

В качестве примера, будет создана хранимая функция getDatabaseVersionStr, возвращающая строку с версией базы данных Oracle Database:

 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Data;
 using Oracle.DataAccess.Client;
 using Oracle.DataAccess.Types;

 namespace OraNetSPSample1
{
     public class Class1
    {
         public static String v_xResult;

            // Получаем объект соединения с базой данных:OracleConnection();
            OracleConnection v_xConneсtion =  newOracleConnection();
            
            //открываем соединение:
            v_xConnection.Open();

            //создаем команду-запрос к базе даных:
            OracleCommand v_xCommand = v_xConnection.CreateCommand();
            v_xCommand.CommandText = "select * from v$version";

            //выполняем запрос:
            OracleDataReader v_xReader = v_xCommand.ExecuteReader();

            //считываем результат
            v_xReader.Read();
            v_xResult = v_xReader.GetString(0);

            //освобождаем объекты
            v_xReader.Close();
            v_xCommand.Dispose();

            //Возвращаем результат:
             return v_xResult;
        }
    }
}

В одной сборке может содержаться несколько .NET-хранимых процедур. Все они должны быть реализованы как статические методы класса.

Публикация .NET-хранимых процедур в среду выполнения на сервере Oracle Database Процесс публикации .NET-хранимой процедуры на сервере Oracle Database состоит из двух шагов:

  • копирование скомпилированной сборки на файловую систему сервера с установленной БД Oracle Database;
  • создание PL/SQL-оболочки для прозрачного вызова .NET-процедуры в коде PL/SQL.

В отличие от Java-хранимых процедур, PL/SQL-оболочка создается не явным образом, а в виде зашифрованной PL/SQL-процедуры с вызовами внутреннего системного пакета DBMS_CLR. Генерацию этой процедуры-оболочки производит мастер установки (deploy wizard) ODT .NET.

В ходе процесса публикации, также создается внешняя библиотека (library) базы данных Oracle. Указанная библиотека ссылается на dll-файл сборки .NET.

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

Для запуска мастера публикации сборки необходимо в среде MS Visual Studio выбрать пункт меню "Build/Deploy <имя проекта>".


Рис.11 Запуск мастера публикации сборки на сервере Oracle Database
В появившемся диалоговом окне необходимо создать соединение к нужной базе данных:



Рис.12 Создание соединения к базе даных
Следует обратить внимание, что пользователь, указанный в соединении, должен иметь роль SYSDBA.

В следующем диалоговом окне необходимо выбрать режим публикации сборки с хранимой процедурой на стороне сервера Oracle Database. Всего возможны три режима публикации:

  • Copy assembly and generate stored procedure;
  • Copy assembly only
  • Generate stored procedures only.

При первой установке .NET-хранимой процедуры следует выбрать пункт "Copy assembly and generate stored procedure".


Рис.13 Выбор режима публикации .NET-процедуры

В следующем диалоговом окне необходимо указать имя библиотеки (external library) Oracle Database; по умолчанию устанавливается имя dll-файла сборки.


Рис.14 Определение имени внешней библиотеки (external library) Oracle Database

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


Рис.15 Выбор файлов дял копирования на сервер

Для определения схемы БД, в которой будет опубликована .NET-хранимая процедура, предназначен следующий шаг мастера.


Рис.16 Определение схемы БД для публикации хранимой процедуры

Важным аспектом публикации .NET-хранимой процедуры является установка соответствия между типами ее параметров и типами PL/SQL. Установка соответствия производится с помощью выбора кнопки "Parameter Type Mapping:".


Рис.17 Установка соответствия типов .NET и Oracle Database

Более полная информация по соответствию типов содержится в документе OracleR Data Provider for .NET Developer's Guide 10g Release 2 (10.2.0.2)B28089-01

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


Рис.18 Выполнение .NET-хранимых процедур

После публикации .NET-хранимой процедуры на сервере базы данных Oracle Database, ее вызов аналогичен вызову любой другой PL/SQL-процедуры.
Для проверки работоспособности процедуры можно выполнить в среде SQL*Plus следующий набор команд:

SQL> conn spnet_demo/spnet_demo
Соединено.
SQL> set serveroutput on
SQL> exec dbms_output.put_line(GetDatabaseVersionStr);
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod

Процедура PL/SQL успешно завершена.

Отличительной особенностью .NET-хранимых процедур является возможность их отладки на стороне клиента. Для этого достаточно заменить строку соединения в свойстве ConnectionString класса OracleConnection на соединение к удаленной базе данных. Для этого можно использовать либо макроподстановку, либо глобальную строковую переменную:

v_xConnection.ConnectionString = v_xConnectionStr;

В преведенным выше примере кода, простой заменой значения переменной v_xConnectionStr на значение"context connection=true", можно обеспечить возможность выполнения статических методов на сервере БД Oracle.
Для разработки .NET-хранимых процедур можно использовать любые среды и языки программирования которые поддерживают Microsoft .NET, например Borland Delphi 2005/2006. Для этого необходимо лишь сгенерировать процедуру создания PL/SQL оболочки в среде MS Visual Studio 2003, и перевести заголовок класса в соответствующий эквивалент на языке Object Pascal. Для публикации сборки, созданной в Borland Delphi, на сервер Oracle Database, достаточно просто скопировать dll-файл сборки в каталог %ORACLE_HOMEbinclr.

Заключение

Обеспечив возможность создания и выполнения .NET-хранимых процедур, корпорация Oracle предоставила в распоражение разработчиков мощные возможности по созданию приложений .NET которые работают с Oracle Database на платформе MS Windows.
Использование .NET-хранимых процедур позволит объединить огромную мощь серверов Oracle Database10g с новыми технологическими и архитектурными решениями которые предлагает платформа Microsoft .NET.

Ссылки

E-mail this page