Announcement

Collapse
No announcement yet.

Stored Proc - Abrage als String mit for - Schleife

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

  • Stored Proc - Abrage als String mit for - Schleife

    Hallo,

    ich habe folgendes Problem:

    In einer Tabelle sind die Namen anderer Tabellen eingetragen. Nun möchte ich in einer Stored Procedure diese Tabellen-Namen auslesen und dann über ein select verjoinen.

    Ich müsste also eine Variable anlegen die mir diese Select zusammen baut. Ich bräuchte als eine for-Schleife über den Cursor mit den Tabellennamen mit dem ich dann den Select zusammenbauen kann.

    Geht das? Und wenn ja kann mir da jemand nen Tipp geben?

    Grüße Oli

  • #2
    Ganz einfach:
    Code:
    for i in(select spaltenname from tabelle) loop
     ...
    end loop;
    Angesprochen wird das ganze innerhalb der Schleife mit i.spaltenname.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Im anhängenden Beispiel sind die zwei Varianten dafür enthalten:
      a) SYS_REFCURSOR (Tabellennamen holen - ginge in Deinem Beispiel auch mit einfachem Cursor)
      b) dynamisches SQL mit EXECUTE IMMEDIATE (Tabellen dynamisch auswerten)
      Das gibt Dir hoffentlich den gewünschten Tipp.
      Code:
      SET SERVEROUTPUT ON SIZE 1000000;
      
      DECLARE
         iCnt       NUMBER;
         tTabname   VARCHAR2 (30)    := 'user_tables';
         tTabelle   VARCHAR2 (30);
         sqlText    VARCHAR2 (32767);
         cTabCurs   sys_refcursor;
      
      BEGIN
      
         --die ersten 10 Usertabellen schön alphabetisch in cTabCurs ablegen
         sqltext := 'SELECT table_name FROM ' || tTabname || ' WHERE rownum<=10 ORDER BY table_name ';
      
         --sys_refcursor öffnen
         OPEN cTabCurs FOR sqltext;
      
         --Fetch in cTabCurs und Schleife über die Ergebnisse
         LOOP
      
            FETCH cTabCurs INTO tTabelle;
            EXIT WHEN cTabCurs%NOTFOUND;
      
            DBMS_OUTPUT.put ('Tabelle=' || tTabelle);
      
            --dynamisches SQL bauen und Ergebnis (Zeilenzahl) abholen
            sqltext := 'SELECT count(*) FROM ' || tTabelle;
      
            --und ausführen
            EXECUTE IMMEDIATE sqltext INTO icnt;
      
            DBMS_OUTPUT.put_line (' hat ' || iCnt || ' Sätze');
      
         END LOOP;
      
         CLOSE cTabCurs;
      END;
      
      Tabelle=TAB01  hat 8334 Sätze
      Tabelle=TAB02  hat 1016 Sätze
      Tabelle=TAB03  hat 206 Sätze
      Tabelle=TAB04  hat 0 Sätze
      Tabelle=TAB11  hat 704 Sätze
      Tabelle=TAB12  hat 115 Sätze
      Tabelle=TAB31  hat 516 Sätze
      Tabelle=TAB66  hat 10 Sätze
      Tabelle=TAB89  hat 497 Sätze
      Tabelle=XTAB7  hat 0 Sätze

      Comment

      Working...
      X