SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

VB oo4o + SQL 応用編8 oo4o ストアドファンクション - PL/SQL ブロック

oo4o は、Oracle RDBMS でみ使用可能です。

■ストアドファンクション / ストアドプロシジャ

  ・ExecuteSql での実行

  Dim pret

'** パラメタ追加
  OraDatabase.Parameters.Add "ret", 0, ORAPARM_OUTPUT
  set pret = OraDatabase.Parameters("ret")
  pret.ServerType = ORATYPE_VARCHAR2

'** ストアドファンクション実行
  OraDatabase.ExecuteSql "begin :ret := sak.GetTmp(); end;"

'** 戻り値取得
  msgbox pret.value

'** パラメタ解消
  OraDatabase.Parameters.Remove "ret"

  ・CreateSql での実行

  Dim OraSqlStmt
  Dim pret

'** SQL 作成
  Set OraSqlStmt = OraDatabase.CreateSql("begin :ret := sak.GetTmp(); end;" _
    , ORASQL_DEFAULT)

'** パラメタ追加
  OraDatabase.Parameters.Add "ret", 0, ORAPARM_OUTPUT
  set pret = OraDatabase.Parameters("ret")
  pret.ServerType = ORATYPE_VARCHAR2

'** ストアドファンクション実行
  OraSqlStmt.Refresh

'** 戻り値取得
  msgbox pret.value

'** パラメタ解消
  OraDatabase.Parameters.Remove "ret"

'** パラメタクエリ解消
  Set OraSqlStmt = Nothing

■補足

  ・戻り値以外の入力、出力、入出力パラメタも通常のバインド変数でアクセス
    すれば良い。"begin :ret := sak.GetTmp(:para1, :para2); end;"

  ・戻り値がない場合は、"begin sak.GetTmp(:para1, :para2); end;" となる。

  ・ストアドの実行に限らず、begin ... end; の PL/SQL ブロックを処理する
    ことができる。begin ... end; でまとめられるものは、一度に発行した方
    がレスポンスは良い。

■現実的なコード例

Option Explicit

'** oo4o 変数宣言
  dim OraSession
  dim OraDatabase
  dim OraSqlStmt
  Dim pret

'=======================================================================
'  準備
'=======================================================================
Private Sub Form_Load()

  dim dbname as string
  dim cnuser as string

'** エラートラップ開始
  on local error resume next

'** アイキャッチ表示
  'Load FormLogo
  'FormLogo.Show
  'DoEvents
  '// 接続に 10 秒ほどかかるので、「データベース接続中...」などの
  '// モードレスダイアログを表示すると良い。

'** サービス、ユーザ設定
  dbname = ""
  cnuser = "SAK/SAK"
  '// Oracle サービス名(別名)、ユーザ・パスワード指定

'** oo4o 接続
  Set OraSession = CreateObject("OracleInProcServer.XOraSession")
  if err <> 0 then
    MsgBox "データベースに接続出来ません。" & chr(10) _
      & "CreateObject - Oracle oo4o エラー"
    end
  end if
  Set OraDatabase = OraSession.OpenDatabase(dbname, cnuser, ORADB_DEFAULT)
  if err <> 0 then
    MsgBox "データベースに接続出来ません。" & chr(10) _
      & err & ": " & error
    end
  end if

'** SQL 作成
  Set OraSqlStmt = OraDatabase.CreateSql("begin :ret := sak.GetTmp(); end;" _
    , ORASQL_DEFAULT)
  if OraDatabase.LastServerErr = 1008 then OraDatabase.LastServerErrReset
  if err <> 0 or OraDatabase.LastServerErr <> 0 then
    MsgBox "SQL 作成に失敗しました。" & chr(10) _
      & err & ": " & error & chr(10) _
      & "oo4o: " & OraDatabase.LastServerErrText
    end
  end if

'** パラメタ追加
  OraDatabase.Parameters.Add "ret", 0, ORAPARM_OUTPUT
  set pret = OraDatabase.Parameters("ret")
  pret.ServerType = ORATYPE_VARCHAR2
  if err <> 0 or OraDatabase.LastServerErr <> 0 then
    MsgBox "パラメタ追加に失敗しました。" & chr(10) _
      & err & ": " & error & chr(10) _
      & "oo4o: " & OraDatabase.LastServerErrText
    end
  end if

'** アイキャッチ終了
  'Unload FormLogo
  '// 接続が完了すれば、「データベース接続中...」をクローズする。

'** エラートラップ終了
  on local error goto 0

End Sub

'=======================================================================
'  後始末
'=======================================================================
Private Sub Form_Unload(Cancel As Integer)

'** パラメタ解消
  OraDatabase.Parameters.Remove "ret"

'** パラメタクエリ解消
  Set OraSqlStmt = Nothing

'** oo4o 接続解除
  Set OraDatabase = Nothing
  Set OraSession = Nothing

End Sub

'=======================================================================
'  メイン
'=======================================================================
Private Sub Command1_Click()

'---- ExecuteSql での実行 ----
  print "-- ExecuteSql での実行 --"

'** ストアドファンクション実行
  OraDatabase.ExecuteSql "begin :ret := sak.GetTmp(); end;"

'** 戻り値取得
  print pret.value

'---- CreateSql での実行 ----
  print "-- CreateSql での実行 --"

'** ストアドファンクション実行
  OraSqlStmt.Refresh

'** 戻り値取得
  print pret.value

  print "-- 終了 --"

End Sub

■VB oo4o + SQL 応用編資料
■VB ADO + SQL 応用編資料
■VB RDO + SQL 応用編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
■VB テクニック編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2024 Y.SAK