ORA-01000: maximum open cursors exceeded
Bir oturumda OPEN_CURSORS’ın izin verdiğinden fazla açık cursor var. Bu genelde bir sızıntıdır: uygulama statement ve result set’lerini kapatmıyordur. Önce sızıntıyı giderin; sınırı artırmak hatayı yalnızca geciktirir.
ORA-01000 ne demek?
OPEN_CURSORS, tek bir oturumun aynı anda kaç cursor açık tutabileceğini sınırlar. Bu sınır veritabanı toplamı için değil, oturum başınadır. Uygulama bir döngüde statement açıp hiç kapatmıyorsa sayı büyür ve ORA-01000, çoğu zaman uygulama başladıktan saatler sonra ortaya çıkar.
ORA-01000 neden olur?
- Statement ve result set’leri kapatmayan uygulama kodu, özellikle hata yollarında.
- Açık bırakılan PL/SQL açık (explicit) cursor’ları ya da ref cursor’lar.
- Sızan cursor’ları biriktiren uzun ömürlü havuz bağlantıları.
- Gerçekten karmaşık bir uygulama için düşük ayarlanmış
OPEN_CURSORS.
ORA-01000 nasıl çözülür?
- Cursor’ları hangi oturumun ve hangi SQL’in tuttuğunu görün:
V$OPEN_CURSOR. - Statement ve result set’leri finally bloğunda ya da try-with-resources ile kapatın.
- PL/SQL’de açık ve ref cursor’ları, exception bloğu dahil, kapatın.
OPEN_CURSORS’ı yalnızca sayı büyümeden yüksek bir seviyede sabit kalıyorsa artırın.
ORA-01000 örneği
En çok cursor’u hangi oturumlar, hangi SQL için tutuyor?
SELECT sid, sql_text, COUNT(*) AS cursor_sayisi
FROM v$open_cursor
GROUP BY sid, sql_text
ORDER BY cursor_sayisi DESC
FETCH FIRST 20 ROWS ONLY;
Yalnızca yük gerçekse:
ALTER SYSTEM SET open_cursors = 1000 SCOPE = BOTH;
SQLlightspeed’de
Bir ifade hata verdiğinde SQLlightspeed’in hata paneli, hata kodunu sade bir Türkçe açıklama ve ne yapmanız gerektiğine dair bir öneriyle; Oracle’ın kendi mesajı ve Oracle dokümantasyonuna bağlantıyla birlikte gösterir — bu hata ve sık görülen onlarca başka hata için.
İlgili hatalar
ORA-00020ORA-04031ORA-03113 Tüm Oracle hataları →
Oracle dokümantasyonu: ORA-01000. Oracle, Oracle Corporation’ın tescilli ticari markasıdır. SQLlightspeed’in Oracle ile bir bağlantısı yoktur.