サーバ上のスキーマに登録済のプロシジャルーチンを、クライアント側から呼び出して実行するには、SQL制御文のCALL文を使用します。プロシジャルーチンに引数を指定することで、外部からの入力情報によって処理制御を切り替えることができます。CALL文の指定方法を以下に示します。
[RDOを利用したプロシジャルーチンの実行方法]
Set Qry = Con.CreateQuery("", "CALL 在庫管理.営業所別発注処理(?)") (1) (2) Qry.rdoParameters(0).Value = INDATA (3) Qry.Execute
(1) スキーマ名
(2) ルーチン名
(3) 引数
RDOおよびRDO以外を利用したプロシジャルーチンの実行方法の詳細は、それぞれ以下を参照してください。
RDO連携時:C.2.8 ストアドプロシジャの実行
ADO連携時:C.3.8 ストアドプロシジャの実行
ADO.NET:C.5.8 ストアドプロシジャの実行
“図4.1 ルーチン実行時のクライアントとサーバの関係”に、図4.3 プロシジャルーチン内の処理結果の通知方法に示したプロシジャルーチン定義を実行した場合のクライアントとサーバの関係を示します。
一時表を利用してプロシジャルーチンの結果を返却する方法
プロシジャルーチン内の処理で取り出したデータを呼出し側のアプリケーションに返却するには、パラメタ変数を利用します。しかし、表から抽出した大量のデータを返却する場合、パラメタ変数では実現できません。このような場合、一時表を利用することで実現できます。
以下に、概要を示します。
(1) アプリケーションからプロシジャルーチン(該当者の過去診断情報)を呼び出します。
(2) プロシジャルーチンで抽出されたデータを、一時表(該当者一時表)に格納します。
(3) プロシジャルーチンが終了します。
(4) 一時表に格納されている、プロシジャルーチン内での抽出結果を、アプリケーションに取り込みます。
CREATE PROCEDURE SCM2.該当者の過去診断情報( IN P年齢範囲1 SMALLINT, IN P年齢範囲2 SMALLINT, IN P性別 CHAR(4), IN P血液型 CHAR(5) ) BEGIN DECLARE SQLSTATE CHAR(5); DECLARE SQLMSG CHAR(256); DECLARE S管理番号 INTEGER; -- 入力された条件に該当する、過去の患者の管理番号を抽出する DECLARE CUR01 CURSOR FOR SELECT 管理番号 FROM SCM1.患者管理表 WHERE 年齢 BETWEEN P年齢範囲1 AND P年齢範囲2 AND 性別 = P性別 AND 血液型 = P血液型; -- ハンドラ宣言 DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK WORK; -- 例外が発生した場合、ROLLBACKして終了する RESIGNAL; -- 発生した例外事象をCALL文の結果として通知する END; DECLARE CONTINUE HANDLER FOR NOT FOUND BEGIN END; -- データなし例外発生時は処理を継続する -- 最初に初期化 DELETE FROM SCM00.該当者一時表; -- 該当者の管理番号の抽出 OPEN CUR01; LOOP1:LOOP FETCH CUR01 INTO S管理番号; IF (SQLSTATE = '02000') THEN LEAVE LOOP1; END IF; -- 該当者の過去の診察情報を取り出して一時表に格納する INSERT INTO SCM00.該当者一時表 SELECT 患者名, 診察日, 担当医, 診断結果, 診断詳細, 血圧 FROM SCM1.診察結果管理 WHERE 管理番号 = S管理番号; END LOOP LOOP1; CLOSE CUR01; COMMIT WORK; END
備考. 一時表“該当者一時表”はON COMMIT PRESERVE ROWS指定とします。
'オブジェクト宣言 Dim Env As rdoEnvironment Dim Con As rdoConnection Dim Qry As rdoQuery Dim Rst As rdoResultset Dim msgstr As String Dim i As Integer Set Env = rdoEngine.rdoEnvironments(0) 'コネクション接続 Set Con = Env.OpenConnection("DSN01", rdDriverNoPrompt, _ False, "UID=USER01;PWD=PASS01;") 'プロシジャルーチンの呼び出し Set Qry = Con.CreateQuery("", "CALL SCM2.該当者の過去診断情報(?,?,?,?)") Qry.rdoParameters(0).Value = 20 Qry.rdoParameters(1).Value = 40 Qry.rdoParameters(2).Value = "男性" Qry.rdoParameters(3).Value = "A RH+" Qry.Execute '一時表のデータを出力する Set Rst = Con.OpenResultset( _ "SELECT * FROM SCM00.該当者一時表 ORDER BY 患者名, 診察日", _ rdOpenForwardOnly, _ rdConcurReadOnly, _ rdExecDirect) i = 1 Do Until Rst.EOF msgstr = "" msgstr = "[" & i & "]" msgstr = msgstr & "患者名=" & Rst.rdoColumns(0).Value msgstr = msgstr & ", 診察日=" & Rst.rdoColumns(1).Value msgstr = msgstr & ", 担当医=" & Rst.rdoColumns(2).Value msgstr = msgstr & ", 診断結果=" & Rst.rdoColumns(3).Value msgstr = msgstr & ", 診断詳細=" & Rst.rdoColumns(4).Value msgstr = msgstr & ", 血圧=" & Rst.rdoColumns(5).Value MsgBox msgstr, vbOKOnly, "Resultset" Rst.MoveNext i = i + 1 Loop Rst.Close Con.Close Set Rst = Nothing Set Qry = Nothing Set Con = Nothing Set Env = Nothing