VBAからOracleのストアドプロシージャを実行する方法について記載します。
VBAからOracleに接続する方法は以前の記事を参考にしてください。
ストアドプロシージャの作成
入力引数で受け取った文字列の文字数を出力引数として返すストアドプロシージャを作成します。
ストアドプロシージャをOracleでコンパイルしてエラーがないことを確認してください。
CREATE OR REPLACE PROCEDURE sample(str IN VARCHAR2, len OUT NUMBER) IS BEGIN len := LENGTH(str); END ; /
コマンドの設定
コマンドオブジェクトにストアドプロシージャの実行情報を設定します。
Dim cmd As New ADODB.Command cmd.ActiveConnection = Connectionオブジェクト cmd.CommandType = コマンドの種類 cmd.CommandText = ストアドプロシージャ名
パラメータの設定
パラメータオブジェクトにストアドプロシージャへの引数を設定します。
Dim prm As ADODB.Parameter Set prm = cmd.CreateParameter prm.Name = 引数の名前 prm.Type = 引数の型 prm.Direction = 引数のモード prm.Size = 引数の最大長 prm.Value = 引数の値 cmd.Parameters.Append prm
引数は1行で設定することもできます。
Set prm = cmd.CreateParameter(引数の名前, 引数の型, 引数のモード, 引数の最大長, 引数の値)
ストアドプロシージャの実行
コマンドオブジェクトのExecuteメソッドでストアドプロシージャを実行します。
cmd.Execute
実行結果の表示
実行結果はパラメータオブジェクトに引数名を指定することで取得できます。
cmd.Parameters(引数の名前).Value
サンプルプログラム
Oracleに接続してストアドプロシージャの実行と結果を表示するサンプルプログラムを記載します。
Option Explicit
Sub sample()
On Error GoTo ERR_HANDLER
Dim strSQL As String
Dim i As Long
'オブジェクトの作成
Dim cn As New ADODB.Connection
'接続文字列の設定
cn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=ネットサービス名;User ID=ユーザ名;Password=パスワード"
'Oracle接続
cn.Open
'ストアドプロシージャの実行情報を設定
Dim cmd As New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc 'コマンドの種類
cmd.CommandText = "sample" 'ストアドプロシージャ名
'ストアドプロシージャへの引数を設定
Dim prm As ADODB.Parameter
Set prm = cmd.CreateParameter
'入力引数
prm.Name = "str" '引数の名前
prm.Type = adChar '引数の型
prm.Direction = adParamInput '引数のモード
prm.Size = 10 '引数の最大長
prm.Value = "テスト" '引数の値
cmd.Parameters.Append prm
'出力引数
Set prm = cmd.CreateParameter
prm.Name = "len" '引数の名前
prm.Type = adInteger '引数の型
prm.Direction = adParamOutput '引数のモード
cmd.Parameters.Append prm
'ストアドプロシージャの実行
cmd.Execute
'実行結果の表示
ActiveSheet.Range("A1") = cmd.Parameters("len").Value
'オブジェクトのクローズ
cn.Close
'オブジェクトの開放
Set prm = Nothing
Set cmd = Nothing
Set cn = Nothing
Exit Sub
ERR_HANDLER:
'エラーメッセージ
MsgBox Err.Number & ")" & Err.Description
'オブジェクトのクローズ
If Not cn Is Nothing Then
If cn.State = adStateOpen Then cn.Close
End If
'オブジェクトの開放
Set prm = Nothing
Set cmd = Nothing
Set cn = Nothing
End Sub

