Announcement

Collapse
No announcement yet.

EXCEPTION NO_DATA_FOUND funktioniert nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • EXCEPTION NO_DATA_FOUND funktioniert nicht

    Hallo zusammen,

    ich habe hier eine Prozedur welche mir die aktuell verfügbaren MedienIDs und die dazugehörigen ExemplarID aus einer Bibliothek ausliest.

    Jetzt möchte ich noch eine EXCEPTION haben, welche mir eine Fehlermeldung ausgibt wenn ich eine nicht vorhanden MedienID ausgeben möchte.

    So wie ich es jetzt implementiert habe funktioniert es leider nicht.

    Hat vllt. einer von euch eine Idee?

    Vielen vielen Dank im voraus :-)


    Code:
    create or replace
    PROCEDURE MEDIENAUSLEIHE (l_ausweisnummer VARCHAR2, l_medienid VARCHAR2) AS
    
    
    CURSOR c_verfuegbareExemplare is
    
    select Medienid, exemplarid from Exemplar
    where (exemplar.exemplarid, exemplar.medienid) not in (select exemplarid, medienid from reservierung where abholung_bis <= sysdate)
    and exemplar.exemplarid in (select exemplarid from Ausleihe where TATSAECHLICHES_RUECKGABEDATUM  is not NULL)
    and exemplar.medienid = l_medienid;
    l_exemplarid VARCHAR2(20);
    l_mediumid VARCHAR2(20);
    
    
    BEGIN
    
    open c_verfuegbareExemplare;
      
      dbms_output.put_line('Medium ID ' || ' ExemplarID'); 
      
      LOOP 
      
      FETCH c_verfuegbareExemplare INTO l_mediumid, l_exemplarid;  
    
           EXIT WHEN c_verfuegbareExemplare%NOTFOUND;   
      
      
      dbms_output.put_line(l_mediumid || ' (' || to_char(l_exemplarid) || ')');
      END LOOP; 
    
    EXCEPTION
    WHEN NO_DATA_Found THEN DBMS_OUTPUT.put_line('MedienID nicht vorhanden');
    
    END MEDIENAUSLEIHE;

  • #2
    Eine expliziter Cursor wirft keine Exception wenn keine Datensätze gefunden wurden, das macht nur ein impliziter Cursor (SELECT ... INTO).

    Du kannst aber das Cursorattribut %ROWCOUNT abfragen. Dieses liefert dir die per Fetch abgerufenen Zeilen zurück.

    Code:
    ...
    IF c_verfuegbareExemplare%ROWCOUNT = 0 THEN
     --Deine Meldung hier
    END IF;
    ...
    PS: Vergiss nicht deinen Cursor auch wieder zu schließen. Des weiteren solltest Du Übergabeparameter nicht mit l_ (lokal) sondern mit p_ (parameter) beginnen lassen, damit Du hier eine bessere Unterscheidung hast. Ansonsten kanns dir passieren, dass eine lokale Variable, die genauso heißt wie ein Parameter, diesen überdeckt und Du wunderst dich, dass nichts funktioniert.

    Comment


    • #3
      viele Dank für die fixe Antwort. Werde ich gleich mal ausprobieren.

      Gibt es eigentlich eine möglichkeit durch den Cursor zu navigieren?

      Meine Aufgabe ist ein Exemplar der Ausweisnummer zuzuordnen und da der Cursor momentan alle verfügbaren ExemplarID`s ausgibt weißt ich nicht wie ich an den ersten Datensatz bzw. irgendeinen Datensatz aus dem Cursor kommen soll.

      Google hilft mir hierbei leider auch nicht weiter vielleicht habt ihr ja noch eine Idee :-)

      viele Grüße

      Comment


      • #4
        Du kannst mit FETCH die einzelnen Zeilen in deine Variablen einlesen (das amchst Du ja auch schon), allerdings durchsucht man so keine Datenmenge nach einer bestimmten ID, das läßt man vorher schon die Datenbank machen.
        Dazu erweiterst einfach deinen Cursor um eine entsprechende Filterbedingung:
        Code:
        select Medienid, exemplarid from Exemplar
        where (exemplar.exemplarid, exemplar.medienid) not in (select exemplarid, medienid from reservierung where abholung_bis <= sysdate)
        and exemplar.exemplarid in (select exemplarid from Ausleihe where TATSAECHLICHES_RUECKGABEDATUM  is not NULL)
        and exemplar.medienid = l_medienid
        and exemplar.ausweisnummer=l_ausweisnummer

        Comment


        • #5
          die Funktion (exemplar.ausweisnummer=l_ausweisnummer) würde mir ja jetzt alle bücher ausgeben welche auf die Ausweisnummer gespeichert sind oder nicht?

          ich muss jedoch ein exemplar welches frei ist auf die Ausweisnummer "buchen".

          Habe das ER-Model mal bei ImageShack hochgeladen. Leider ist die Datei zugross um direkt im Forum hochzuladen

          http://img29.imageshack.us/img29/3200/unbenanntyiq.jpg

          Comment


          • #6
            Was heißt hier buchen? Das ist erstmal nur ein Select.
            Ich weiß nicht, was Du mit dem Ergebnis machen möchtest da hilft auch ein Datenmodell nichts.

            Comment


            • #7
              es soll so funktionieren:

              ich logge mich mit meiner Ausweisnummer ein, gebe eine MediumID von dem gewünschtem Buch ein.

              Entweder ist das Buch verliehen oder es gibt noch Exemplare von diesem Titel in der Bibliothek. Wenn es noch Exemplare gibt soll eine ExemplarID für mich reserviert/ausgeliehen werden (mit Ausleihbestätigung und Datum der Rückgabe - akt. Datum + 30 Tage), sind keine Exemplare mehr verfügbar gibt es eine Meldung wann das nächste Exemplar frei wird.

              Nur wie bekomme ich den die ExemplarID aus meiner Abfrage zur weiterverarbeitung heraus?

              Ich hoffe jetzt hab ich nicht für komplette Verwirrung gesorgt.

              Comment

              Working...
              X