色携晩囂胎務

 孀指畜鷹
 廣゛過
朴沫
臥心: 7951|指鹸: 0

Oracleのストアド・プロシ�`ジャをVB��C#で��峰する圭隈

[鹸崙全俊]
窟燕噐 2007-5-25 15:42:05 | �塋照�何促蚊 |堋響庁塀
はじめに Oracle Database 10g Release2では、デ�`タベ�`スのストアドプロシ�`ジャ��ファンクション��參和、ストアドプロシ�`ジャ��を.NET����冱�ZであるVB.NETやC#で恬撹できます。これらの.NET����冱�Zで恬撹されたストアドプロシ�`ジャを仝.NETストアドプロシ�`ジャ々と柵びます。そして、これを�g�FするのがOracleDatabase Extensions for .NET��參和、ODE.NET��です。
 宥械、Oracleのストアドプロシ�`ジャはPL/SQLという冱�Zで��峰する駅勣がありますが、ODE.NETを旋喘すると、PL/SQLを旋喘したことのない�_�k宀でも、VBやC#といった冱�ZでOracleのストアドプロシ�`ジャを恬撹できます。書指は、ODE.NETを旋喘して.NETストアドプロシ�`ジャを��峰してみましょう。
���黎i宀
  • VB、もしくはC#でOracleのストアプロシ�`ジャを��峰したい繁。
駅勣な�h廠 Visual Studio 2005 Standard Edition參貧が駅勣です。また、ODE.NETはOracleDatabase 10g Release2��10.2.0��から�g廾された�C嬬で、Windows貧で�嘛�するOracleに�浙┐気譴泙后�OracleのEditionはStandardEdition ONE參貧から旋喘辛嬬です。その麿、.NETストアドプロシ�`ジャの�_�k、デプロイを佩うために、Oracle Developer Tools for Visual Studio .NET 10.2��參和、ODT 10.2��が駅勣になります。
ODE.NETのインスト�`ル��1/2�� ODE.NETをインスト�`ルしてみましょう。ODE.NETはOracleデ�`タベ�`ス�箸��C嬬なので、Oracleをインスト�`ルする�rにODE.NETも匯�wにインスト�`ルします。廣吭泣として、ODE.NETはデフォルトではインスト�`ルされないため、デ�`タベ�`スをインスト�`ルする�Hのインスト�`ル・タイプで�曠�スタム�櫃鰡x�kします。


屡にOracleをインスト�`ル�gみの��栽
 屡にOracleをインスト�`ル�gみの�h廠では、壅業インスト�`ラを軟�咾垢襪海箸牌啓咼ぅ鵐好肌`ルが辛嬬です。この��栽は、Oracle Home��Oracleがインスト�`ルされているディレクトリ��をインスト�`ル枠として峺協してください。

 肝に、インスト�`ルするコンポ�`ネントとして��Oracle Database Extensions for .NET 10.2.0.1.0�櫃縫船Д奪�を秘れます。


 デ�`タベ�`スのインスト�`ル瘁、デ�`タベ�`ス・コンフィギュレ�`ション・アシスタント��DBCA��でデ�`タベ�`スを恬撹する�Hに、デ�`タベ�`ス・テンプレ�`トとして�曠�スタム・デ�`タベ�`ス�櫃鰡x�kし、デ�`タベ�`ス・コンポ�`ネントに��.NETのOracle DatabaseExtensions�櫃鰡x�kする駅勣があります。


 參貧で、ODE.NETがインスト�`ルされました。ただし貧��の恬�Iでインスト�`ルされたODE.NETのバ�`ジョンは10.2.0.1.0で、.NET Framework 1.xに��鬉靴�ODE.NETになります。.NET Framework 2.0に��鬉靴�ODE.NETは、Oracle Technology Network��參和、OTN��からダウンロ�`ドします。


 貧��サイトから、��Oracle Data Provider for .NET 2.010.2.0.2.20�櫃鬟�リックし、��Oracle Developer Tools for Visual Studio .NET withODAC10.2.0.2.20�櫃鬟�リックします�┐海海�らはOTNへのログインが駅勣になり、ログインしていない��栽は、ログインを佩う鮫中が燕幣されます��。
 ライセンス弐�s��が燕幣されるので、すべての坪否を�_�Jして駅勣なチェックボックスをオンにし�柩�吭する�櫂椒織鵑鬟�リックすると、ファイルのダウンロ�`ドペ�`ジが燕幣されます。��ODTwithODAC10202.exe�櫃鬟�リックすると、ファイルのダウンロ�`ドが�_兵します。
 ダウンロ�`ドした仝ODTwithODAC10202.exe々は徭失盾��侘塀の�R�sファイルになっていますので、エクスプロ�`ラからダブルクリックして盾��すると、仝stage々と仝install々という2つのフォルダが恬撹されます。仝install々フォルダから仝setup.exe々を�g佩し、Oracle UniversalInstaller��參和、OUI��軟�咾気察犬茲Δ海宗垢了�中で、�朶里悖櫂椒織鵑鬟�リックします。


 仝インスト�`ルする�u瞳の�x�k々の鮫中で、��Oracle Database Extensions for .NET 10.2.0.1.0�櫃鰡x�kして�朶里悖櫃鬟�リックします。


 仝ホ�`ムの����の峺協々鮫中で、インスト�`ル枠を峺協します。ここで嶷勣な泣として、枠ほどインスト�`ルした仝Oracle Database Extensions for .NET 10.2.0.1.0々と揖匯のインスト�`ル枠を峺協してください。


 仝インスト�`ルするコンポ�`ネントの�x�k々の鮫中で、燕幣されてる2つのコンポ�`ネントをチェックして、�朶里悖櫃鬟�リックします。


 肝のような鮫中が燕幣された��栽は、


 仝サ�`ビス々匯�Eから 仝OracleOraDb10g_home��xx��ClrAgent々のサ�`ビスを唯峭します。


 OUIに��り�朶里悖櫃鬟�リックすると、肝のような鮫中が燕幣されます。


 コマンドプロンプトを�_き、燕幣されているディレクトリに卞�咾靴討�ら、SQL*PLUSで肝のように仝DBMSClr.plb々を�g佩します。
DBMSClr.plbの�g佩箭
D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN>sqlplus sys/[パスワ�`ド]
as sysdba

Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
に俊�Aされました。

SQL> @DBMSClr.plb

゛ 余嶄福待 ゛

PL/SQLプロシ�`ジャが屎械に頼阻しました。

エラ�`はありません。

SQL>

 貧��のスクリプトを�g佩したら�朶里悖櫃鬟�リックし、サマリ�`鮫中でインスト�`ルされるコンポ�`ネントを�_�J瘁、�曠ぅ鵐好肌`ル�櫃鬟�リックしてインスト�`ルを�g佩します。インスト�`ルが頼阻したら、.NET Framework 2.0に��鬉靴�ODE.NETのインスト�`ルが頼阻です。
 肝に、ODE.NETを旋喘するための�O協を佩います。ODE.NETはリスナ�`を�U喇して.NETストアドプロシ�`ジャを�g佩します。Oracle Netの�O協に���}がある��栽、仝ORA-28575: 翌何プロシ�`ジャ・エ�`ジェントへのRPC俊�Aをオ�`プンできません。々というエラ�`が�k伏する辛嬬來があります。そのため、參和の2つのファイルについて�_�Jを佩います。
  • listener.ora
  • tnsnames.ora
 これらのファイルは、Oracleデ�`タベ�`スをインスト�`ルしたフォルダ��Oracleホ�`ム��參和の仝NETWORK\ADMIN々フォルダにあります。これらのファイル坪に參和の��峰があるかを�_�Jしましょう。
.NETストアドプロシ�`ジャを嗤�燭砲垢襪燭瓩淋O協
SID_LIST_LISTENER =
(SID_LIST =
  (SID_DESC =
   (SID_NAME = PLSExtProc)
   (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
   (PROGRAM = extproc)
  )
  (SID_DESC =
   (SID_NAME = CLRExtProc)
   (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
   (PROGRAM = extproc)
  )
)

.NETストアドプロシ�`ジャを嗤�燭砲垢襪燭瓩淋O協
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
  (ADDRESS_LIST =
   (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
  )
  (CONNECT_DATA =
    (SID = CLRExtProc)
    (PRESENTATION = RO)
  )
.NETストアドプロシ�`ジャの�_�kとデプロイ

 ODE.NETを聞喘するための���笋��Kわったら、Visual
Studioで.NETストアドプロシ�`ジャを恬撹しましょう。書指はデ�`タベ�`スへのアクセスのない、���gな.NETストアドプロシ�`ジャを恬撹するこ
とで、�_�kからデ�`タベ�`スへのデプロイまでの返��を�h苧します。ODTがインスト�`ルされた�h廠で、Visual
Studioを軟�咾垢襪函∃造靴ぅ廛蹈献Д�トとして、��Oracle Project�櫃鰡x�kすることができます。






 ��Oracle Project�櫃鰡x�kして.NETストアドプロシ�`ジャの恬撹を�_兵します。肝のような.NETストアドプロシ�`ジャを��峰するためのコ�`ドエディタが燕幣されます。






 では、�g�Hに.NETストアドプロシ�`ジャを��峰してみましょう。.NETストアドプロシ�`ジャとしてデプロイするプロシ�`ジャやファンクション
は、VB.NETの��栽は仝Public Shared々、C#の��栽は仝public
static々で傚冱されている駅勣があります。この泣に廣吭して、仝SCOTT々ユ�`ザ�`の仝EMP々燕にアクセスする���gなコ�`ドを��峰してみます。


仝SCOTT々ユ�`ザ�`の仝EMP々燕にアクセスするサンプル

Public Shared Function GetEmpName(ByVal empno As Integer) As String
  'コネクションの�_羨
  Dim conn As New OracleConnection("context connection=true")
  conn.Open()

  ''SQLの�k佩と�、糧ゝ�
  Dim cmd As OracleCommand = conn.CreateCommand
  cmd.CommandText = "SELECT ename FROM emp WHERE empno=:1"
  cmd.Parameters.Add(":1", OracleDbType.Int32, empno, _
    ParameterDirection.Input)
  Dim rdr As OracleDataReader = cmd.ExecuteReader

  Dim strRet As String
  If rdr.Read Then
    strRet = rdr.Item("ename")
  Else
    strRet = ""
  End If
  rdr.Close()
  conn.Close()

  Return strRet
End Function


仝SCOTT々ユ�`ザ�`の仝EMP々燕にアクセスするサンプル

public static string GetEmpName(int empno)
  {
    // コネクションの�_羨
    OracleConnection conn =
      new OracleConnection("context connection=true");
    conn.Open();

    // SQLの�k佩と�、糧ゝ�
    OracleCommand cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT ename FROM emp WHERE empno=:1";
    cmd.Parameters.Add(":1", OracleDbType.Int32,empno,
      ParameterDirection.Input);
    OracleDataReader rdr = cmd.ExecuteReader();

    String strRet = "";
    if(rdr.Read())
    {
      strRet = rdr.GetString(0);
    }
    else
    {
      strRet = "";
    }
    rdr.Close();
    conn.Close();

    return strRet;
  }
}



 貧��コ�`ドのように、宥械のデ�`タアクセスのコ�`ドと寄餓なく.NETストアドプロシ�`ジャを��峰できるのが尖盾できるかと房います。匯つ�珎`泣
として�い欧蕕譴襪里�コネクション�_羨�rの��峰圭隈が�`う泣です。宥械ODP.NETからOracleデ�`タベ�`スへ俊�Aする�Hの俊�A猟忖双は、


宥械のODP.NETからOracleデ�`タベ�`スへ俊�Aする�Hの俊�A猟忖双

"User Id=scott;Password=tiger;Data Source=orcl"


 貧��のようになりますが、.NETストアドファンクションでは肝のような��峰になります。


宥械のODP.NETからOracleデ�`タベ�`スへ俊�Aする�Hの俊�A猟忖双

"context connection=true"


 .NETストアドプロシ�`ジャでは柵び竃し圷のコネクションを哈き�@ぐため、柵び竃し圷のユ�`ザ�`IDやパスワ�`ド秤�鵑發修里泙渙�き�@がれま
す。そのため、俊�A猟忖双嶄にDBユ�`ザ�`の秤�鵑鰉�峰する駅勣がありません。また、コネクション秤�鵑塙欧縫肇薀鵐競�ションも哈き�@がれますので、.
NETストアドプロシ�`ジャ坪で仟�、縫肇薀鵐競�ションを�_兵する駅勣はありません。コ�`ドの��峰が�Kわったら、肝にOracleデ�`タベ�`ス�箸法�恬撹
された.NETストアドプロシ�`ジャをデプロイします。Visual
Studioのメニュ�`バ�`より�曠咼襯稗�-�曠愁螢紿`ションの塘崔�櫃鬟�リックします。






 これにより.NETアセンブリのビルドが佩われ、デ�`タベ�`スへのデプロイを佩うためのOracle Deployment Wizard for .NETが軟�咾靴泙后�このウィザ�`ドを旋喘することで、肝のような恬�Iをウィザ�`ド侘塀で佩うことが辛嬬です。


  • .NETアセンブリの恬撹
  • .NETアセンブリのデプロイ
  • .NETアセンブリを柵び竃すためのPL/SQLラッパ�`の恬撹






 デプロイを佩う�Hに.NETストアドプロシ�`ジャのセキュリティレベルの�O協を佩います。セキュリティレベルについては參和の燕を歌孚してください。


燕1 .NETストアドプロシ�`ジャ/ファンクションのセキュリティレベル

セキュリティレベル�h苧
Safe�┘妊侫�ルト��デ�`タベ�`ス・リソ�`スへのアクセスのみが�S辛される。ロ�`カル・ファイルやネットワ�`クなどの翌何リソ�`スへのアクセスは�S辛されない。
Externalロ�`カル・ファイルの�i函りまたは���zみと、ソケットやインタ�`ネット・ノ�`ドなどのネットワ�`ク・リソ�`スへのアクセスも�S辛される。
Unsafe砿尖されていないコ�`ドの�g佩を根め、崙�泙覆靴��g佩が�S辛される。麿のすべてのセキュリティ・レベルのス�`パ�`セット。



.NETストアドプロシ�`ジャの�g佩

 デプロイが頼阻したらOracleエクスプロ�`ラより、.NETストアドプロシ�`ジャを�g佩してみましょう。書指はストアド・ファンクションにな
るので、.NETストアド・ファンクションを柵び竃すための、PL/SQLファンクションが揖じ兆念で恬撹されています。嘔クリックして���g佩�櫃鬟�リッ
クしてみます。






 ファンクションを�g佩した瘁に、哈方を秘薦するダイアログが燕幣されますので、哈方を秘薦して��OK�櫂椒織鵑鬟�リックすると�Y惚が燕幣されま
す。參貧のように��Oracleエクスプロ�`ラ�櫃�ら柵び竃すこともできますし、宥械のSQL猟から.NETストアドプロシ�`ジャを柵び竃すこともできま
す。ストアドファンクションの��栽は、肝のようにSQLにPL/SQLラッパ�`を岷俊��峰します。ストアドプロシ�`ジャの��栽は、仝EXECUTE
��EXEC��々猟を�k佩します。


.NETストアドプロシ�`ジャの柵び竃し箭

C:\>SQLPLUS scott/tiger

SQL> SELECT getempname(7369) FROM dual;

GETEMPNAME(7369)
------------------------------------------

SMITH



 宥械のPL/SQLで��峰したストアドプロシ�`ジャと揖��に.NETストアドプロシ�`ジャ��ファンクションを柵び竃せることが�_�Jできたと房います。


おわりに

 書指は、.NETストアドプロシ�`ジャを�g�FするODE.NETの古勣と、ODE.NETのインスト�`ル、および�O協圭隈、.NETストアドプロ
シ�`ジャの�_�k返��を���gなサンプルを聞って盾�hしました。肝指は、ODE.NETで恬撹された.NETストアドプロシ�`ジャをデバッグする圭隈と、
PL/SQLではできない�I尖をODE.NETで�g�Fするための��並を誘後していきます。ご豚棋ください��

)

 肝に、ODE.NETはWindowsサ�`ビスとして借�咾垢襪里如◆献稀`ビス々匯�Eから 仝OracleOraDb10g_home��xx��ClrAgent々サ�`ビスが�_兵されていることを�_�Jします。


 參貧で、ODE.NETを聞喘する���笋詫蠢砲任后�
指鹸

聞喘祇醤 訟烏

艇俶勣鞠村朔嘉辛參指愉 鞠村 | 廣゛過

云井持蛍号夸

弌菜塁|返字井|色携晩囂

GMT+8, 2026-10-8 05:41

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

酔堀指鹸 卦指競何 卦指双燕