- 締切済み
SQLについて教えてください。
お世話になります。 ORACLE SQLについて質問させて下さい。 ACCESS2003より以下のようなSQLを発行しています。 SELECT A.商品CD, A.区分, SUM(A.数量) AS 受数量, SUM(A.金額) AS 受金額 FROM テーブル1 A INNER JOIN テーブル2 B ON SUBSTR(A.商品CD,1,13) = B.商品コード WHERE A.年 = 2008 AND A.月 = 03 AND B.区分 = '51' GROUP BY CUBE(A.商品CD, A.区分) ORDER BY A.商品CD, A.区分 集計のSQLです。 SQLは正しいと思うのですが、実行結果が返ってきません。0件です。 調べていたところ、SQLを発行した後のレコードカウントに 「実行時エラー '-2147467259' データプロバイダまたはほかのサービスがE_FAIL状態を返しました。」 とあり、件数が0件(SQL自体動いていない?)でした。 SQL自体は開発ツールとして使用している、「オブジェクトブラウザ」のSQL発行機能にて実際に動かしてデータも正しく抽出されることは確認してるいるのですが。。 他にネットで調査したところ、抽出件数が多すぎると上記のようなエラーが起こる?みたいな事も書いてありました。 しかし、結果の件数はそんなに多くはないのです。(200レコードくらい。) なぜ起こるか、どうすればいいか、が良く分かりません。。。 解決策、回避策がありましたら教えていただきたいと思います。 SQLを発行するサブルーチンも記載しておきます。 ↓↓↓ Public Function cmn_DoSelectSql(ByVal pstrSql As String, pstrData() As String) As Long Dim lngErrNum As Long 'エラー値 Dim strErrMsg As String 'エラーメッセージ Dim adoRs As ADODB.Recordset 'レコードセット Dim lngColCnt As Long '最大レコード数 Dim lngRowCnt As Long '最大フィールド数 Dim objField() As Object Dim lngCol As Long 'レコードカウントアップ用 Dim lngRow As Long 'フィールドカウントアップ用 On Error Resume Next cmn_DoSelectSql = 0 '変数初期化 g_lngOraRecCnt = 0 'パラメータチェック If pstrSql = "" Then Call cmn_ErrMsgDsp("-", "パラメータ異常が発生しました。") cmn_DoSelectSql = -9 Exit Function End If If (g_adoCon Is Nothing) Then Call cmn_ErrMsgDsp("-", "パラメータ異常が発生しました。") cmn_DoSelectSql = -9 Exit Function End If Set adoRs = New ADODB.Recordset adoRs.CursorLocation = adUseClient 'SQL実行 adoRs.Open pstrSql, g_adoCon, adOpenStatic, , adCmdText 'エラーセット lngErrNum = Err strErrMsg = Error(Err) 'エラーメッセージ表示 If (lngErrNum <> 0) Then Select Case lngErrNum '排他エラー Case 54: cmn_DoSelectSql = -2 'その他 Case Else Call cmn_ErrMsgDsp(lngErrNum, strErrMsg) cmn_DoSelectSql = -1 End Select GoTo sub_Exit End If '列数セット lngColCnt = adoRs.Fields.Count If adoRs.RecordCount > 0 Then ←ココに上記エラーメッセージが入ってきます。。。 g_lngOraRecCnt = adoRs.RecordCount lngRowCnt = adoRs.RecordCount '受渡用変数初期化 ReDim pstrData(1 To lngRowCnt, 1 To lngColCnt) Erase objField ReDim objField(0 To lngColCnt - 1) For lngCol = 0 To lngColCnt - 1 Set objField(lngCol) = adoRs.Fields(lngCol) Next lngCol '受渡用変数セット For lngRow = 0 To (lngRowCnt - 1) For lngCol = 0 To (lngColCnt - 1) pstrData(lngRow + 1, lngCol + 1) = Cmn_NullToSpace(objField(lngCol).Value) Next lngCol adoRs.MoveNext Next lngRow End If sub_Exit: If (Not adoRs Is Nothing) Then adoRs.Close Set adoRs = Nothing End If End Function 自分で開発したものではないのですが、コレといって間違いはないように思えます。。 もし何かありましたらアドバイス等お願い致します。 ・・・集計SQLは実行できないのでしょうか。。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jamshid6
- ベストアンサー率88% (591/669)
ここを書き換えてみてください、ということです。 >adoRs.CursorLocation = adUseClient adUseServerに変更してうまくいけば、予想通りの理由。同じエラーが出るなら、別の理由ということになります。
- jamshid6
- ベストアンサー率88% (591/669)
ググったら1つヒットしました。 http://support.microsoft.com/kb/267455/ja OracleのバージョンもMDACのバージョンも不明なので、MDAC2.7までならそのような事象が発生する可能性があるみたいですよ。 (確かにCubeはNOT NULL列にNULLが返ってくる可能性がありますね) サーバカーソルを使えと書いてあります。
補足
jamshid6様 お礼の方が遅くなり申し訳ありませんでした。 回答ありがとうございました!! CUBEでNULLが返ってくるのがダメだったのですね!! 納得です。 ただ、サーバカーソルを使用するとありますがピンときません。 リンク先も見てみたのですが。。 どういうことでしょうか。(すいません。。)