Announcement

Collapse
No announcement yet.

dynamischen cursor öffnen und auslesen

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

  • dynamischen cursor öffnen und auslesen

    Hallo,

    sorry, dass ich nerven muss aber ich hab schon foren durchsucht, Bücher studiert usw. und komm einfach nicht auf die Lösung (wahrscheinlich bin ich übersucht und deshalb komm ich net drauf)...

    Also, möchte einfach einen dynamischen Cursor öffnen und auslesen und zwar mit folgendem Code:
    create or replace procedure PR_TAGESLOGFILES_ERSTELLEN

    is


    type r_RSP_WERTE is record (
    LZA_ID number(4),
    SCHALTBED_ID number(2)
    );


    type sys_refcursor is REF CURSOR return r_RSP_WERTE;
    crs_RSP_WERTE sys_refcursor;



    begin


    open crs_RSP_WERTE for 'select LZA_ID, SCHALTBED_ID from RSP_WERTE_ order by ZEIT';



    loop
    fetch crs_RSP_WERTE into r_RSP_WERTE;
    exit when crs_RSP_WERTE%notfound;
    --Schleifenanweisung

    end loop;


    end;



    leider krieg ich hierbei den Fehler:
    PLS-00455: cursor 'CRS_RSP_WERTE' cannot be used in dynamic SQL OPEN statement



    hilfe!!
    danke :-)

  • #2
    Hallo,

    du definierst in deiner procedure einen "starken" Cursor und diesen validiert der ORACLE-Server bereits beim kompilieren. Da du den Cursor aber mit dynamischem SQL (Zeichenkette) öffnest, kann er dies nicht - deshalb die Fehlermeldung beim Komplilieren.
    Du hast jetzt zwei Möglichkeiten:
    1. Du verwendest kein dynamisches SQL, will heißen du läßt einfach die Hochkommas um das Statement weg.
    2. Du verwendest einen "schwachen" oder einfach einen impliziten Cursor.

    Für deine einfache Schleife würde sich ein impliziter Cursor anbieten. Aber ich denke mal so einfach wird sie in der Realität nicht sein, sonst würdest du kein dynamisches SQL verwenden

    Gruß Falk
    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
      Hallo Falk,

      irgendwie steh ich voll aufm Schlauch;-)

      hab mal folgendes Beispiel aus der Oracle Dokumentation raus kopiert, das eigentlich das macht, was ich möchte:

      TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;
      emp_cv empcurtyp;
      emp_rec employees%ROWTYPE;
      BEGIN
      OPEN emp_cv FOR SELECT * FROM employees WHERE employee_id < 120;
      LOOP
      FETCH emp_cv INTO emp_rec; -- fetch from cursor variable
      EXIT WHEN emp_cv%NOTFOUND; -- exit when last row is fetched
      -- process data record
      DBMS_OUTPUT.PUT_LINE('Name = ' || emp_rec.first_name || ' ' ||
      emp_rec.last_name);
      END LOOP;
      CLOSE emp_cv;
      END;

      allerdings sagt er mir beim kompilieren:
      PLS-00201: identifier 'EMPLOYEES' must be declared

      wenn ich jetzt wüsste wie ich EMPLOYEES declaren muesste, dann glaub ich hätte ichs (hab schon etliches mit records und so versucht aber....:-(

      danke
      christoph

      Comment


      • #4
        Originally posted by Alfons Wiesmeier View Post
        ...
        allerdings sagt er mir beim kompilieren:
        PLS-00201: identifier 'EMPLOYEES' must be declared
        ...
        Hallo christoph,

        EMPLOYEES ist eine Tabelle aus den Standardbeispielen von Oracle. Auf einem "normalen" System sollten diese NICHT installiert sein! Es ist also nicht verwunderlich, wenn er das Objekt (die Tabelle) EMPLOYEES nicht kennt

        Die einfachste Variante für dein erstgenanntes Bsp. wäre m.E. ein expliziter Cursor in einer Cursor For-Schleife:
        [highlight=sql]
        create or replace procedure PR_TAGESLOGFILES_ERSTELLEN as
        CURSOR crs_RSP_WERTE IS
        select LZA_ID, SCHALTBED_ID from RSP_WERTE_ order by ZEIT;

        begin
        for r_RSP_WERTE in crs_RSP_WERTE
        loop
        --Schleifenanweisung
        end loop;
        end;
        [/highlight]

        Die Cursor For-Schleife hat den Vorteil, das Oracle implizit das
        - Deklarieren des Records,
        - Öffnen des Cursors
        - Fetchen des Cursors in den Record
        - Schließen des Cursors
        übernimmt.
        Die Schleife wird automatisch beendet, wenn der letzte DS abgerufen wurde.

        Gruß Falk
        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


        • #5
          Hallo Falk,

          nochmals danke...

          Problem ist nur, dass ich den Tabellenname aus welcher der Cursor liest, erst zur Laufzeit zusammenstellen kann.
          (die Tabelle heisst nicht nur RSP_WERTE_ sondern hat eben noch nen Zusatz (z.B. RSP_WERTE_005) )

          christoph

          Comment


          • #6
            Hallo christoph,

            irgendsowas hab ich mir fast gedacht, da ja keiner dynamisches SQL aus Spaß verwendet

            Hier bleibt dir dann nur der Weg mit dem "schwachen" Cursor und damit verbundenen evtl. Laufzeitfehlern.
            [highlight=sql]
            create or replace procedure PR_TAGESLOGFILES_ERSTELLEN AS
            type r_RSP_WERTE is record (
            LZA_ID number(4),
            SCHALTBED_ID number(2)
            );
            type sys_refcursor is REF CURSOR;

            crs_RSP_WERTE sys_refcursor;
            res_r_RSP_WERTE r_RSP_WERTE;
            begin
            open crs_RSP_WERTE for
            'select LZA_ID, SCHALTBED_ID from RSP_WERTE_ order by ZEIT';
            loop
            fetch crs_RSP_WERTE into res_r_RSP_WERTE; -- Hier gibts zur Laufzeit eine EXCEPTION,
            -- wenn die Datentypen nicht passen
            -- und auch nicht implizit konvertiert werden können
            exit when crs_RSP_WERTE%notfound;
            --Schleifenanweisung
            end loop;
            end;
            [/highlight]

            Gruß Falk
            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


            • #7
              Hallo Falk,

              sorry, war im Urlaub...

              danke...Dir mal wieder :-)

              Comment

              Working...
              X