Announcement

Collapse
No announcement yet.

PL/SQL

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

  • PL/SQL

    Hallo kann mir jemand beim meinem Problem helfen.
    Ich will mit hilfe von einem PL/SQL - Procedure
    Alle Rechnungen zum Kunden finden.

    Folgendes habe ich versucht:

    Procedure Rechnungen
    ( p_Kundennummer IN Integer,
    P_Rechnummer out Rechnungsbuch.RNB_NUMMER%TYPE%,
    p_Betrag out Rechnungsbuch.RNB_BRUTTO%TYPE)
    IS
    CURSOR CUR_RECHNUNG IS
    SELECT RNB_BRUTTO, RNB_NUMMER
    FROM RECHNUNGSBUCH
    WHERE NUMMER = p_Kundennummer;
    BEGIN
    OPEN CUR_RECHNUNG;
    LOOP
    FECHT CUR_RECHNUNG INTO P_Betrag,P_Rechnummer;
    EXIT WHEN CUR_RECHNUNG%NOTFOUND;
    END LOOP;

    END;

    Diese Procedure liefert mir nur den letzten Datensatz zurück.
    Das heiß wenn der Kunde mehr als eine Rechnung hat, so liefert
    es mir nur denn letzten DS.
    Was ich auch nachvollziehen kann.

    Ich brauche aber alle Rechnungen zum Kunden.
    Kann jemand mir helfen, es eilt.

    PS: Wenn es geht, bitte auch noch wie ich diese Procedure unter
    Delphi ausführe.

    Danke.

  • #2
    Hallo Delmel,

    Innerhalb der LOOP-Schleife wird doch jeder Datensatz einzeln durchlaufen, dort mußt du den Code hinpacken der für jede Rechnung ausgeführt werden soll.<pre>
    BEGIN
    OPEN CUR_RECHNUNG;
    LOOP FETCH CUR_RECHNUNG INTO P_Betrag,P_Rechnummer;
    EXIT WHEN CUR_RECHNUNG%NOTFOUND;
    <I> ... hier kann jeder Rechnungsdatensatz bearbeitet werden ...</I>
    END LOOP;
    END;

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Klaro, die Schleife durchläuft alle Datensätze und bricht nach dem letzten ab, die dann in den Parametern sind.

      Wenn die Abarbeitung nicht innerhalb der Prozedur geschehen soll, gibt es die Möglichkeit einer sog. PL/SQL - Table als Rückgabewert einer Funktion (!) statt einer Parameterübergabe (out) in der Prozedur. Dann ist es angemessen, alles in eine Package zu legen. Hier ein Beispiel, den Du bearbeiten kannst:

      create or replace
      Package rechnung_util
      IS
      type t_rechnung is table of rechnungsbuch%rowtype index by binary_integer;
      function rechnungen( p_kundennummer in integer) return t_rechnung;
      END;

      create or replace
      package body Rechnung_UTIL
      IS
      function rechnungen( p_kundennummer in integer) return t_rechnung is
      CURSOR CUR_RECHNUNG IS
      SELECT RNB_BRUTTO, RNB_NUMMER
      FROM RECHNUNGSBUCH
      WHERE NUMMER = p_Kundennummer;
      ret_rechnung rechnung_util.t_rechnung;
      i int := 0;
      BEGIN
      OPEN CUR_RECHNUNG;
      LOOP
      fetch CUR_RECHNUNG INTO ret_rechnung(i);
      i := i + 1;
      EXIT WHEN CUR_RECHNUNG%NOTFOUND;
      END LOOP;

      -- als Beispiel, wie PL/SQL Table verwendet wird:
      i := ret_rechnung.first;
      while i < ret_rechnung.last loop
      dbms_output.put_line(ret_rechnung(i).per_id);
      i := ret_rechnung.next(i);
      end loop;

      return ret_rechnung;
      END;
      end

      Comment

      Working...
      X