Başlangıç > Database, Forms, Hata, Oracle, PL/SQL, Reports > ora-01422:exact fetch returns more than requested number of rows hatası

ora-01422:exact fetch returns more than requested number of rows hatası


Merhaba,

Pl/sql ortamında ya da oracle forms içindeki kullanımlarda bazen hazırladığımız sql lerden into ile alacağımız değerler kısmında birden fazla kayıt gelmesi durumunda ora-01422 hatası alınır.Örnek olarak aşağıdaki sql ler kontrol edilebilinir.

DECLARE
  ora_01422 NUMBER(12);
BEGIN
  BEGIN
    SELECT rownum
      INTO ora_01422
      FROM dual
    CONNECT BY rownum < 10;
  END;
END;

Bu script çalıştırıldığı zaman ora-01422 hatası alınır.Çünkü into olarak almamız gereken kayıt sayısı 1 adettir.Ama sql e dikkat edilir ise CONNECT BY ifadesi ile 10 dan küçük olan rownum lar yani 9 satırlık bir veri çekilmiştir.Fakat aşağıdaki sql de ise sorun olmadan istediğimiz kaydı alabiliriz.

DECLARE
  ora_01422 NUMBER(12);
BEGIN
  BEGIN
    SELECT rownum
      INTO ora_01422
      FROM dual;
  END;
END;
  1. altan
    11 Aralık 2010, 12:53

    selam;
    yaptığım sorguda kaç satır döneceğini bimiyorum bütün satırları döndürebileceğim bir veritipi varmı

    Beğen

    • 13 Aralık 2010, 09:46

      Bu konu ile ilgili olarak şöyle bir işlem yapabilirsin. Kaç satır veri döneceğini bilmediğin bir sql var ise öncelikle o sqli count() ile çalıştırıp kaç satır veri geldiğine bakan ve gelen değere göre çalışan bir declare ya da begin end bloğu yazabilirsin. Sıkıntılı sqli paylaşırsan sql üzerinde yardımcı olmaya çalışırım.

      Beğen

  2. Fatih Demir
    04 Mart 2012, 16:09

    Merhaba kolay gelsin.
    Aşşağıdaki kodla :MahalleAdi değerine göre sorgu yapmak istiyorum fakat

    :MahalleAdi değişkenine -1 den farklı bir değer girdiğimde

    [Error] Execution (2: 1): ORA-01422: tam okuma istenilenden daha fazla sayıda satır döndürür
    ORA-06512: konum satır 33

    :MahalleAdi değişkenine -1 girdiğimde ise

    PL/SQL Procedure successfully completed diyor ama çıktı olarak hiç bir şey vermiyor.

    Nerede hata yapıyorum bir yardımcı olursanız sevinirim.

    Not : Dönen satır sayısı her zaman 1 den fazla ve girilen değere göre sürekli değişiklik gösteren bir yapı…

    DECLARE
    CURSOR m
    IS
    SELECT zeminhisseid,
    parselid,
    mahalleadi,
    bolumno
    FROM tsm
    WHERE NVL (adano, ‘-1’) = :AdaNo
    AND parsel = :ParselNo
    AND mahalleadi = :MahalleAdi;

    l_zeminhisseid tsm.zeminhisseid%TYPE;
    l_parselid tsm.parselid%TYPE;
    l_mahalleadi tsm.mahalleadi%TYPE;
    l_bolumno tsm.bolumno%TYPE;
    BEGIN
    FOR records IN m
    LOOP
    IF :Mahalleadi = ‘-1’
    THEN
    SELECT zeminhisseid,
    parselid,
    mahalleadi,
    bolumno
    INTO l_zeminhisseid,
    l_parselid,
    l_mahalleadi,
    l_bolumno
    FROM tsm
    WHERE NVL (adano, ‘-1’) = :AdaNo AND parsel = :ParselNo;
    ELSE
    SELECT zeminhisseid,
    parselid,
    mahalleadi,
    bolumno
    INTO l_zeminhisseid,
    l_parselid,
    l_mahalleadi,
    l_bolumno
    FROM tsm
    WHERE NVL (adano, ‘-1’) = :AdaNo
    AND parsel = :ParselNo
    AND mahalleadi = :MahalleAdi;
    END IF;

    DBMS_OUTPUT.put_line (records.zeminhisseid);
    END LOOP;
    END;

    Beğen

    • 04 Mart 2012, 16:36

      Merhaba
      Öncelikle şunu belirtmeliyim. Bir sql yazdığında select ve into kullanıyorsan çalışan sql sonucu mutlaka 1 satır veri getirmesi gerekiyor ve bu değer into ile ilgili değişken veya değişkenlere atanabilsin. Bu sebeple yazdığın sql için into kullanmadan önce gelen değerleri iyi belirlemen lazım. Eğer sql sonucunda birden fazla satır gelecekse ve hepsini kullanacaksan sql i bir cursor içine alıp loop ile dönerek her değer için into işlemini yaparak sorununu çözebilirsin.
      Bu bilgilere göre kodlamanı tekrar düzenleyip sorununu çözebilirsin.
      Kolay gelsin.

      Beğen

      • Fatih Demir
        05 Mart 2012, 01:12

        Yardımın için teşekkür ederim. Sorgudaki değişkene göre gelen satır sayısını hesaplamak gibi bir lüksüm olmadığından ve sqlin bu beceriksiz yapısını da anladıkdan sonra mecbur kalmadıkça sql e yönelmek mantıksız gibi duruyor.
        İyi Çalışmalar…

        Beğen

      • 05 Mart 2012, 09:52

        Merhaba
        Seçim konusunda tercih sana ait ama istediğini sql ile de rahatlıkla yapabilirsin fakat bir önceki cevabımda belirttiğim durumları kontrol etmen gerekli.
        Kolay gelsin.

        Beğen

  1. No trackbacks yet.

Yorum bırakın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.