ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 アプリケーション開発ガイド(ODBCドライバ編)

4.4.2 プロシジャルーチンの実行

サーバ上のスキーマに登録済のプロシジャルーチンを、クライアント側から呼び出して実行するには、SQL制御文のCALL文を使用します。プロシジャルーチンに引数を指定することで、外部からの入力情報によって処理制御を切り替えることができます。CALL文の指定方法を以下に示します。

プロシジャルーチン実行の指定方法

[RDOを利用したプロシジャルーチンの実行方法]

Set Qry = Con.CreateQuery("", "CALL 在庫管理.営業所別発注処理(?)")
                                       (1)          (2)
Qry.rdoParameters(0).Value = INDATA
                               (3)
Qry.Execute

(1) スキーマ名

(2) ルーチン名

(3) 引数

RDOおよびRDO以外を利用したプロシジャルーチンの実行方法の詳細は、それぞれ以下を参照してください。

図4.1 ルーチン実行時のクライアントとサーバの関係”に、図4.3 プロシジャルーチン内の処理結果の通知方法に示したプロシジャルーチン定義を実行した場合のクライアントとサーバの関係を示します。

図4.1 ルーチン実行時のクライアントとサーバの関係

一時表を利用してプロシジャルーチンの結果を返却する方法

プロシジャルーチン内の処理で取り出したデータを呼出し側のアプリケーションに返却するには、パラメタ変数を利用します。しかし、表から抽出した大量のデータを返却する場合、パラメタ変数では実現できません。このような場合、一時表を利用することで実現できます。

以下に、概要を示します。

図4.2 一時表を利用したプロシジャルーチンとのデータの受渡し

(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指定とします。

一時表に格納されている、プロシジャルーチン内での抽出結果をアプリケーションで取り出す例(RDO)
'オブジェクト宣言
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