色携晩囂胎務

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

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

[鹸崙全俊]
窟燕噐 2007-5-25 15:42:05 | 塋照何促蚊 |堋響庁塀
はじめに Oracle Database 10g Release2では、デ`タベ`スのストアドプロシ`ジャファンクション參和、ストアドプロシ`ジャを.NET冱ZであるVB.NETやC#で恬撹できます。これらの.NET冱Zで恬撹されたストアドプロシ`ジャを仝.NETストアドプロシ`ジャ々と柵びます。そして、これをgFするのが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 Release210.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のインスト`ル・タイプで曠スタム櫃鰡xkします。


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

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


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


 參貧で、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々は徭失盾侘塀のRsファイルになっていますので、エクスプロ`ラからダブルクリックして盾すると、仝stage々と仝install々という2つのフォルダが恬撹されます。仝install々フォルダから仝setup.exe々をg佩し、Oracle UniversalInstaller參和、OUI軟咾気察犬茲Δ海宗垢了中で、朶里悖櫂椒織鵑鬟リックします。


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


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


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


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


 仝サ`ビス々匯Eから 仝OracleOraDb10g_homexxClrAgent々のサ`ビスを唯峭します。


 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櫃鰡xkすることができます。






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






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

)

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


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

聞喘祇醤 訟烏

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

云井持蛍号夸

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

GMT+8, 2024-5-12 16:23

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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