2011-01-06 1 views
0

私のDelphi/Oracleアプリケーション "ora-01000 - maximum open cursorsers exceeded"内に次のエラーメッセージが表示されます。次のようにコードは次のとおりです。Ora-01000 - 最大オープンカーソルエラーを超えました

begin 
    for i := 0 to 150 do 
    begin 

    with myADOQuery do 
    begin 
     SQL.Text := 'DELETE FROM SOMETABLE'; 
     ExecSQL; -- from looking at V$OPEN_CURSOR a new cursor is added on each iteration for the session 
     Close; -- thought this would close the cursor but doesn't 
    end; 

    end; 

end; 

私は単にOPEN_CURSORSパラメータの数を増やすことで、問題を解決することができます承知している、しかし、私はむしろ、クエリが実行された後、カーソルがクローズさせる解決策を見つけるだろう。何か案は?

デルファイ[閉じる]を省略した場合はどうなります2006 BDS のOracle 10g

+0

あなたは**正確** 10グラムのどのバージョンを使用していますか?つまり、どのパッチセットが適用され、どのパッチ番号があればそれがありますか? –

+0

また、これらのテーブルトリガのいくつかを持っていますか? –

+1

*実際の* SQLは 'i'の現在の値に基づいていると仮定すれば安全ですか?そうすれば、SQLは各反復ごとに異なるでしょうか? –

答えて

2
  • Oracleサポート・ドキュメントID 76684.1およびID 2055810.6を参照してください。私はADOを使用しませんが、ステートメントをキャッシュしないようにOracleを構成する方法を教えてください。
  • デフォルトのmax_cursor値は通常低すぎますが、通常はそれを増やした方が良いです。これにより、Oracleは少しメモリを使用しますが、実際のマシンではめったに問題になりません。
  • テーブル全体を削除するDELETEビヘイビア(トリガを起動する)に頼らない限り、TRUNCATEはDELETEよりも優れています。
+0

この問題についてお手数をおかけしていただきありがとうございます。 SQLをテーブルをTRUNCATEするように変更しました。現在、すべてが完全に動作しています(つまり、カーソルキャッシュはありません)。 – PDM

+0

TRUNCATEはロールバックできないことに注意してください。他にも注意が必要なことがあります。 –

0

+0

同じエラーが発生します。 – PDM

+0

明示的なコミットを行う必要がありますか? – Rikalous

+0

上記のコードはトランザクション内で実行されます。変更を投稿することを確認するユーザーに約束します。 – PDM

1

チェックthis link。私はOracleユーザーではありませんが、カーソルキャッシュがあり、「OPEN_CURSORSをチューニングするための最良のアドバイスはそれを調整するのではなく、心配する必要はありません。だから私は、たとえCloseコマンドがカーソルを閉じても、まだキャッシュに残っていると言います。あなたの現在の状況を確認する方法もいくつかのヒントがあります。

1

代わりにTADOCommandコンポーネントを使用してみてください。

TADOCommandは、最も多くの場合、データ定義言語 (DDL)SQLコマンドを実行 するために使用されるか、または 結果セットを返さない ストアドプロシージャを実行します。

または直接TADOConnection.Execute機能を使用して

関連する問題