- PR -

ORA-604 再帰SQLレベル%sでエラーが・・・ について

1
投稿者投稿内容
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-02-02 21:07
2回目の投稿です。

【ORA-604 再帰SQLレベル%sでエラーが発生しました。】のメッセージがでてしまいます。
但し、この現象は同じロジックでも処理回数が少ない場合はうまくいきます。

下に簡単にロジックを記述します。

=@======================================

Do Until i > flxKensaku.Rows.Count - 1 '←グリッドのデータをまわす
'--- 検索情報有無チェック
If FNCAAA = False Then
Exit Function
End If

'--- データセットへ格納処理 ---
     ・
     ・
     ・

'--- グリッド行をカウントアップ
i = i + 1
Loop
=A======================================
Private Function FNCAAA
Try
'--- SQL作成

'---Oracleに接続(HJUSER48/HJUSER48)
gdbHj.subOpenDatabase(gstrOraUserName, gstrOraPassWord, gstrOraDbName)

'---ダイナセットオープン
intState1 = gdbHj.fncSelect(strSQL)

'---レコード無の場合はエラーリターン
lbolRead = gdbHj.fncFetch(intState1)

If lbolRead = False Then
Exit Function
End If

Do While lbolRead = True
'--- データセットへ格納処理 ---
    ・
    ・
    ・

lbolRead = gdbHj.fncFetch(intState1)

Loop
Catch

Finally
If intState1 <> -1 Then
gdbHj.subFreeSelect(intState1)
End If
'---Oracleを切断
gdbHj.subCloseDatabase()
End Try

End Function
=======================================
【補足】
・@で取得したデータの子テーブルをAの関数で取得し、データセットに格納する処理です。
・エラーになってしまうとき、@のDo〜Loopでまわす回数が多い場合に発生します。
 (50件以上の場合ほぼ100%エラー)
・Aのオラクル接続でエラーにおちます。
 しかし、必ずFinallyでオラクルを切断しているのでセッションは切れているかと思われます。
・オラクル接続/切断は他の処理で正しく動いているため問題ないかと思われます。


このロジックにどこかおかしい点はありますでしょうか?
この事象が発生したことがある方がいらっしゃいましたら、
是非教えて下さい。

よろしくおねがいします。

[ メッセージ編集済み 編集者: TAKAMIKI 編集日時 2005-02-02 21:09 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-02-02 21:29
ORA-604はシステムリソースの不足やデータの破損など、他の様々なシステムトラブルが引き金になって発生することが多いそうです。実際、どんな処理をどのくらい繰り返しているのか判りませんが、コード上の問題ではなくサーバーに問題がある可能性を疑ったほうが良いでしょう。Serverのエラーログを確認して、その前後に他のエラーが発生していないか確認してください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-02-02 22:15
 環境は?Oracleのバージョン、ホストしているOSは?

 なぜにダイナセット?OleDBやODP.NET、OracleClientを使わないのはなぜでしょう?

 oo4oならOTNJの方が回答を得やすいと思います。
_________________
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-02 23:15
私の経験と同様かはわかりませんが・・。

”SQL作成”の部分はどのようにされてますか?
ベタ文字列のSQLを作成しているとしたら
サーバのリソース不足の可能性があると思います。
.NETではありませんが、Oracle8iで同じような経験をして
一度調べたことがあります。
可能な限りSQLのパラメータ化orストアドプロシージャなどを使用しないと、
ベタ文字列のSQLを走らせた場合は、
一文字でも違うSQLが走るたびにサーバリソースを圧迫するようです。
リソースの開放のタイミングが良く分からなかったのですが、
短時間で頻繁にベタ文字列SQLを実行する場合は起こる頻度が多かったのを
記憶しています。(※ユーザー業務が忙しい日中に頻発しました。)

この場合は、現象はサーバ側の問題で発生していますが、
原因元はコードの方となります。



1

スキルアップ/キャリアアップ(JOB@IT)