dynamisches select aus dynamischer table

  • Hi,

    ich bring keine PL SQL funktion zusammen, die dynamisch den command code zusammenbaut um aus einer dynamischen table zu selecten. Hat jemand vielleicht eine Idee, wie man oracle dazu überzeugen kann?

    Die Funktion soll dazu dienen, gegebene rows beim grouping in einen csv string umzuwandeln. Ohne dem dynamischen zusammenbasteln funkt's, aber ich mag nicht 15x else if, else if, etc. schreiben.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Ich glaube ich kann dir helfen! Habe sowas schon einmal gebraucht und konnte es erfolgreich einsetzen!

    Also für CREATE, INSERT, DELETE und UPDATE kannst du folgendes nehmen:

    Code
    sqlstring := 'CREATE TABLE ' || nameRes || ' (num NUMBER, freq NUMBER, perc NUMBER)';
    EXECUTE IMMEDIATE sqlstring;

    Für ein SELECT (ref_curs ist klarerweise ein vorher erzeugter Cursor)

    Code
    sqlstring  := 'SELECT  '||col||' FROM  '||tname;
       OPEN  ref_curs FOR sqlstring;
       LOOP
          FETCH ref_curs INTO cur;
          EXIT WHEN ref_curs%NOTFOUND;
                 --tue etwas
          END LOOP;
       END LOOP;

    There's no better place than 127.0.0.1!

  • danke für das Beispiel, allerdings löst das mein Problem nicht. Das mit dem dynamischen SQL habe ich schon verstanden gehabt, aber ... das Problem ist eben, dass das select nicht aus einer tabelle ("tname"), sondern aus einem anderen cursor, der der methode übergeben wird, gemacht werden soll ...

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Also es wird ein Cursor übergeben und in dem steht dann der Tabellenname drinnen?


    sorry, hab ich mich vielleicht zu ungenau ausgedrückt. Es eine Spalte einer Tablle vom Typ

    Code
    CREATE OR REPLACE TYPE t_varchar2_column AS TABLE OF VARCHAR2(4000);

    übergeben. Auf dieser Spalte soll dann ein dynamischer Befehl, der ja nach den anderen Parametern ein SELECT, oder SELECT DISTINCT, oder ein ORDER BY ASC, oder ORDER BY DESC etc. enthält.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Ich verstehe noch immer nicht ganz was du genau meinst, aber wie ich das momentan sehe ist es doch so dass du einen Parameter als VARCHAR2 mitgibts, der den Typ der Operation angibt. Wenn du die gesamte Operation angibts, kannst du dir deinen SQLString daraus basteln.

    There's no better place than 127.0.0.1!

  • Ich verstehe noch immer nicht ganz was du genau meinst, aber wie ich das momentan sehe ist es doch so dass du einen Parameter als VARCHAR2 mitgibts, der den Typ der Operation angibt. Wenn du die gesamte Operation angibts, kannst du dir deinen SQLString daraus basteln.


    oki ... ich werde versuchen, das Problem noch genauer zu erklären. Wie schon anfangs erwähnt, hab ich die function "column_to_string" (mittlerweile hab ich sie "rows_to_string" getauft). Eigentlich ist das Problem hier, teils des unter "PL SQL: Untermengen aggregieren" beschriebenen Problems.

    Wenn ich jetzt eine Tabelle items_to_group habe, die so ausschaut:

    Code
    group      item
    a, b, c    a
    a, b       a
    a          a
    a, b, c    b
    a, b       b
    a, b, c    c
    c          c

    dann würde ich gerne mit der folgenden Query, das superset von jedem item finden:

    SQL
    SELECT item, 
         rows_to_string(CAST(COLLECT(group) AS t_varchar2_column), ', ', 'DISTINCT', 'ASC') AS superset
    FROM items_to_group
    GROUP BY item
    ORDER BY item;

    Wie man jetzt sieht, bekommt die function, also keinen Tabellennamen. D.h. das select ist nicht "einfach" ein String. Natürlich könnte man jetzt von der Funktion wollen, dass die items nicht mit "," getrennt sind, oder "DESC" und nicht "ASC" sortieren, etc. etc.

    Die Funktion könnte man genauso für z.B. diese Query verwenden:

    SQL
    SELECT table_name, 
         rows_to_string(CAST(COLLECT(column_name) AS t_varchar2_column), ', ') AS tab_cols
    FROM user_tab_columns
    GROUP BY table_name
    ORDER BY table_name;

    Die Columns sind jetzt zwar unique, aber die funktion würde sie den Namen nach sortiert in einer Zeile anzeigen.

    Erklärt dies mein Problem besser?

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Ja doch, sry, hab' den anderen Thread nicht gesehen.
    Hm...kniffelig. Na ja also da weiß ich auch nicht weiter, tut mir leid!


    mag'da nix. ;) Danke für's Mitdenken auf jeden Fall.

    *** Make it idiot proof, and someone will build a better idiot. ***

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!