タイトル : オラクルのセッションが残ってしまう 投稿日 : 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 'オブジェクト開放 |