tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルオラクルのセッションが残ってしまう
記事No13707
投稿日: 2009/05/29(Fri) 10:10
投稿者NEMO
オラクル10gとVB6.0を使用しています。
テキストファイルより情報を読み出しSQLを発行、その結果セットを利用してストアドを実行するプログラムを作成しましたが、セッションが切断されずに残り、最終的にオラクルのセッション上限に達してしまいオラクルエラーORA-12516が発生する現象が起こっています。

以下に簡略化したソースを提示いたしますが、厳密にセッションを切断する方法がございましたらご教授のほどよろしくお願い致します。

Set OraSession = CreateObject("OracleInProcServer.XOraSession")      'oo4oオブジェクト生成



<<変数A>> = 〜 テキストファイルを読み込み取得 〜

strSQL = "〜 SQL文 〜" & <<変数A>>

Set OraDatabase = OraSession.OpenDatabase(strSV, strConn, ORADB_DEFAULT)  'DB接続
Set OraDynaset = OraDatabase.CreateDynaset(strSQL, ORADYN_READONLY)  'SQL文実行

If OraDynaset.RecordCount <> 0 Then
    <<変数B>> = OraDynaset.Fields("XXX").Value
End If

OraDatabase.Close
OraDynaset.Close
Set OraDatabase = Nothing                'オブジェクト開放
Set OraDynaset = Nothing



Set OraDatabase = OraSession.OpenDatabase(strSV, strConn, ORADB_DEFAULT)  'DB接続

OraSession.BeginTrans                    'トランザクション開始

Call OraDatabase.Parameters.Add("ret", 0, ORAPARM_OUTPUT)
Set pret = OraDatabase.Parameters("ret")
pret.serverType = ORATYPE_NUMBER

Call OraDatabase.Parameters.Add("pvErrCode", Null, ORATYPE_VARCHAR2)
Call OraDatabase.Parameters.Add("pvErrMesg", Null, ORATYPE_VARCHAR2)
Call OraDatabase.Parameters.Add("pvProgramName", Null, ORATYPE_VARCHAR2)

'** ストアドファンクション実行
Call OraDatabase.ExecuteSQL("begin :ret := ストアドA(:pvErrCode,:pvErrMesg,:pvProgramName); end;")
<<変数C>> = pret.Value
'** パラメタ解消
OraDatabase.Parameters.Remove "ret"

OraSession.CommitTrans                   'トランザクションコミット

OraDatabase.Close
Set OraDatabase = Nothing                'オブジェクト開放



Set OraDatabase = OraSession.OpenDatabase(strSV, strConn, ORADB_DEFAULT)  'DB接続

OraSession.BeginTrans                    'トランザクション開始

Call OraDatabase.Parameters.Add("XXXX", <<変数A>>, ORATYPE_VARCHAR2)
        ・
        ・
        ・
Call OraDatabase.Parameters.Add("XXXX", <<変数B>>, ORATYPE_VARCHAR2)

Call OraDatabase.ExecuteSQL("Begin ストアドB(:XXXX,・・・,:XXXX); end;")

OraSession.CommitTrans                   'トランザクションコミット

OraDatabase.Close
Set OraDatabase = Nothing                'オブジェクト開放



Set OraDatabase = OraSession.OpenDatabase(strSV, strConn, ORADB_DEFAULT)  'DB接続

OraSession.BeginTrans                    'トランザクション開始

Call OraDatabase.Parameters.Add("XXXX", <<変数A>>, ORATYPE_VARCHAR2)
        ・
        ・
        ・
Call OraDatabase.Parameters.Add("XXXX", <<変数B>>, ORATYPE_VARCHAR2)

Call OraDatabase.ExecuteSQL("Begin ストアドC(:XXXX,・・・,:XXXX); end;")

OraSession.CommitTrans                   'トランザクションコミット

OraDatabase.Close
Set OraDatabase = Nothing                'オブジェクト開放



Set OraSession = Nothing                 'オブジェクト開放

[ツリー表示へ]
タイトルRe: オラクルのセッションが残ってしまう
記事No13711
投稿日: 2009/05/29(Fri) 11:04
投稿者NEMO
自己解決いたしました。

> Call OraDatabase.Parameters.Add("XXXX", <<変数A>>, ORATYPE_VARCHAR2)
>         ・
>         ・
>         ・
> Call OraDatabase.Parameters.Add("XXXX", <<変数B>>, ORATYPE_VARCHAR2)
>
> Call OraDatabase.ExecuteSQL("Begin ストアドB(:XXXX,・・・,:XXXX); end;")

上記のように変数をセットした後、明示的に

Call OraDatabase.Parameters.Remove("XXXX")

として、変数を開放してやらないと

OraDatabase.Close
Set OraDatabase = Nothing                'オブジェクト開放

などでセッションクローズした後もつかんだままになってしまうようです。

[ツリー表示へ]