Okuyucu tekrar soru zamanı. Bu sefer bir Oracle sorusu ve 'ora-06512 hataları görürseniz ne yapmalısınız'. Oracle'ın benim için bir şey olmadığını itiraf etmeliyim ama Oracle'ın içinde yaşayan ve büyük bir fincan kahve karşılığında bu soruyu cevaplamama yardımcı olacak samimi bir DBA'yı tanıyorum.
Oracle, kırk yıldır çeşitli şekillerde bulunan bir veritabanı yönetim sistemidir. Orijinal olarak Oracle'ın orijinal çalışanlarından birinin adını taşıyan SCOTT şeması adı verilen bir şey kullandı. İlk kez 'Scott' kullanıcı adı ve Scott'ın kedisinden sonra adı verilen 'kaplan' adıyla Oracle'a giriş yaptınız. Artık, Oracle için kullandığınız şeye bağlı olarak çeşitli şemalar kullanılıyor.
Oracle hakkında daha fazla bilgi edinmek istiyorsanız, bu sayfa çok faydalıdır.
Ora-06512 hatayı düzeltmek
Görünüşe göre, bir ora-06512 hatası, bir şeyin yanlış gittiğini değil, bir şeyin yanlış gittiğini söyleyen genel bir istisna hatasıdır.
Örneğin, hata sözdizimi şunları okuyabilir:
ORA-01422: kesin getirme, istenen satır sayısından daha fazlasını döndürür
ORA-06512: "DATABASE_NAME", satır 66
ORA-06512: 1. satırda
İlk satır size hangi tür bir hatanın meydana geldiğini bildirir, bu durumda sorgu, sorgunun beklediğinden daha fazla veri döndürür, böylece nasıl işleneceğini bilmez. 'ORA-01422' kodu, bakmanız gereken gerçek hata kodudur. ORA-06512 sadece genel hata kodudur.
İkinci satır, hatanın nerede olduğunu söyler. DATABASE_NAME, o sırada çalışmakta olduğunuz veritabanı olacak. Satır 66 hatanın oluştuğu satırdır ve hatayı düzeltmek için kontrol etmeniz gereken satırdır.
Hata sözdizimindeki üçüncü satır, aramanın nereden geldiğini söyler. Birinci satırı kontrol et ve DATABASE_NAME ile bir görüşme göreceksin.
Bu hatayı düzeltmek için, ORA-01422'nin neden olduğu sorunu düzeltmeniz gerekir; bu, "tam getirme sayısı istenen sayıda satırdan daha fazla döndürür" veya Oracle'ın bunu görmezden gelmesini söylemek için bir özel durum işleyicisi eklemeniz gerekir. Çekirdek sorununun düzeltilmesi her zaman tercih edilir olduğundan, bu yoldur.
Yapabileceğin iki şey var. Sorgunun tek bir satırdan daha fazlasını döndürmesini bekliyorsanız, bunu değiştiremezsiniz, böylece şaşırmaz. Sorgunun yalnızca tek bir satır döndürmesini beklerseniz, bunun için de değiştirebilirsiniz.
Tek bir satırdan daha fazlasını beklemek:
X in için (t'den * seçimini yapın…)
döngü
- X kaydını burada işlemek
son döngü;
Bu, birden fazla satırın döndürüleceği veritabanı sorgularındaki hatayı ortadan kaldırmalıdır.
Yalnızca tek bir satırın döndürülmesini bekliyorsanız, şunları deneyebilirsiniz:
başla
... içine * seçin.
t dan….
süreci ....
istisna
o zaman NO_DATA_FOUND sonra
kayıt bulunamadığında hata kodu işleme
o zaman TOO_MANY_ROWS
Çok fazla kayıt bulunduğunda kod işleme hatası
son;
Bu ikinci yöntem, 'ORA-01422: kesin getirme istenen satır sayısı hatalarından daha fazla döndürür ve bu nedenle orijinal ORA-06512 hatası' vermeden yalnızca tek satırı teslim etmelidir.
Ayrıca, sorguyu yalnızca birden çok satır yanıtının ilk satırını döndürecek şekilde daraltabilirsiniz. Bu, veritabanı üzerinde tam kontrole sahip değilseniz veya çok fazla şeyle uğraşmak istemiyorsanız, ancak yine de bir cevaba ihtiyacınız varsa işe yarayabilir.
bildirmek
t * seçimi için c1 imleci t…
başla
açık c1;
c1'i içine getir ...
eğer (c1% notfound) o zaman
kayıt bulunamadı hatası
eğer varsa;
kapat c1;
son;
Sonuncu eylemi göremedim ama eminim ki birden fazla geri dönüşün bulunabileceği ancak sadece tek bir satır geri dönüşü istemediğiniz ve hata yapamayacağından emin olabilirsiniz.
Basit bir seçim ifadesi yazacak kadar küçük bir SQL biliyorum ama Oracle'ın bana attığını itiraf etmeliyim. PL / SQL de benzer olsa da, kendimi kaybettim. PL / SQL, SQL'in SQL'e göre daha akıllıca şeyler yapmasına izin veren SQL'in Procedural Language uzantısıdır. Bu PL / SQL SSS'yi, Oracle hakkında bilgi almaya çalışırken faydalı buldum, size de yardımcı olabilir.
Daha önce de belirttiğim gibi, DBA değilim ve belirli veritabanları hakkında çok az şey biliyorum. Kısa zamanım boyunca masamda ve sonraki e-postalarda arkadaşımın bana gösterdiği şeyi iletmek için elimden geleni yaptım. Önemli bir yanlışlık edindiysem yorum bölümünde bana haber ver.