Announcement

Collapse
No announcement yet.

Cursor als In-Out-Parameter

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

  • Cursor als In-Out-Parameter

    Hallo Leute,

    ich möchte einen Cursor in Fkt. 2 verarbeitet, der in Fkt1 zusammengestellt wird.

    Hier einmal meine sehr vereinfachte Übersicht.

    function fkt1(p_nr in number,
    p_liste out cursor_typ) return number is
    begin
    open pListe as
    select * from tabelle where feld = p_nr;
    end;

    function fkt2(p_nr in number) return number
    is
    l_crs cursor_typ;
    begin
    if fkt1(p_nr,l_crs) = 0 then
    for elt in l_crs loop
    ...
    end loop;
    end if;
    end;

    Beide Funktionen sind Bestandteile eines gemeinsamen Packages.

    Leider kann PL/SQL in fkt2 mit l_crs nicht anfangen.
    Was mache ich falsch und wie sollte es korrekt erstellt werden ?

    Gruss Ingo

  • #2
    du musst Cursor erst deklarieren

    DECLARE
    l_crs CURSOR;

    oder ihn zumindest in fkt1 bekannt manche

    Comment


    • #3
      Hallo,

      der Cursor ist in fkt2 durch l_crs cursor_typ bereits deklariert, man kann es durch die Unstruktirierung nicht richtig erkennen.

      Gruss Ing

      Comment


      • #4
        Hallo Ingo,

        die for record in cursor Schleife funktioniert mit Cursorvariablen nicht. Du mußt also mit "herkömmlichen" Mitteln eine Schleife bauen:<pre>
        function fkt2(p_nr in number)
        return number is
        l_crs cursor_typ;
        elt <I>record_typ</I>;
        begin
        if fkt1(p_nr,l_crs) = 0 then
        loop
        fetch l_crs into elt;
        exit when l_crs%NOTFOUND;
        <I>... eigentliche Schleife</I>
        end loop;
        close l_crs;
        end if;
        end;
        </pre>
        Hierbei mußt du jetzt die Recordvariable elt deklarieren! Die Felder müssen denen des Cursors entsprechen. Es gibt keine Chance dies (ähnlich wie bei for rect in cursor) durch den Compiler erledigen zu lassen, da der endgültige Cursor ja erst zur Laufzeit feststeht. Für deinen speziellen Fall wäre aber eine Deklaration - elt tabelle%RowType; - möglich, da du ein select * in den Cursor lädtst.

        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

        Working...
        X