こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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は実行できないのでしょうか。。

投稿日時 - 2008-09-08 18:16:29

QNo.4313496

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

ここを書き換えてみてください、ということです。
>adoRs.CursorLocation = adUseClient

adUseServerに変更してうまくいけば、予想通りの理由。同じエラーが出るなら、別の理由ということになります。

投稿日時 - 2008-09-11 14:13:06

ANo.1

ググったら1つヒットしました。
http://support.microsoft.com/kb/267455/ja
OracleのバージョンもMDACのバージョンも不明なので、MDAC2.7までならそのような事象が発生する可能性があるみたいですよ。
(確かにCubeはNOT NULL列にNULLが返ってくる可能性がありますね)
サーバカーソルを使えと書いてあります。

投稿日時 - 2008-09-09 01:46:31

補足

jamshid6様
お礼の方が遅くなり申し訳ありませんでした。
回答ありがとうございました!!
CUBEでNULLが返ってくるのがダメだったのですね!!
納得です。

ただ、サーバカーソルを使用するとありますがピンときません。
リンク先も見てみたのですが。。
どういうことでしょうか。(すいません。。)

投稿日時 - 2008-09-10 16:32:52

あなたにオススメの質問