Игорь Мельников,
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.
В настоящей статье будет рассмотрены следующие практические
вопросы:
- Установка и конфигурирование Oracle Database 10g Rel.2 для
выполнения .NET-хранимых процедур
- Создание .NET-хранимых процедур в среде MS Visual
Studio 2005 и .NET Framework 2.0
- Публикация хранимых процедур .NET в среду выполнения на
сервер Oracle Database
- Вопросы отладки и распространения .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.
Ссылки