Maulwurf_der_Schlaue Geschrieben 28. August 2006 Teilen Geschrieben 28. August 2006 Hallo, ich verwende Oracle8i und ich möchte folgendes machen. Die Spaltenüberschriften ändern, je nachdem wie ein Status gesetzt ist. Bsp: Übergabeparameter ist 24 dann soll die überschrift der spalten in deutsch sein. wenn der parameter 12 ist dann soll die überschrift in english sein. per sql hab ichs nicht so dynamisch hinbekommen - hat mich nicht gewundert, aber versucht hab ichs halt - weshalb ich es nun in einen anonymen block schreibe (ähnlich einer stored procedure). Leider hab ich keine ahnung wie ich es anstelle das ich das ergebnis so sehe wie wenn ich select * from emp mache. die einzige ausgabemöglichkeit die ich gefunden habe ist dbms_output.put_line... aber das hilft mir nicht. jetzt wolte ich versuchen eine neue temporäre tabelle anzulegen, mit den entsprechend geänderten spaltenüberschriften, erstellen der tabelle funktioniert auch super. wenn ich jetzt den sql-befehl (select * from v_temp) absetze dann geht es nicht weil er sagt variable nicht deklariert. is ja auch irgendwo richtig.. aber ich brauch halt den tabellenname der sich aus 'tmp_' + datum (ohne .) und uhrzeit (ohne ausführen läst, die zum zeitpunkt des anstartens war. so jetzt möchte ich nach dem anzeigen die tabelle wieder löschen, geht aber ohne name nicht. name ist aber weg weil ich ja zwischendrin den block beendet habe um die daten anzuzeigen. wie schaff ich es eine tabelle mit dynamisch erzeugten namen zu erstellen, anzuziegen und anschließend wieder zu löschen? hoffe ihr könnt mir folgen und mir evtl. lösungshinweise geben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 28. August 2006 Teilen Geschrieben 28. August 2006 prinzipiell verstehe ich, was du vorhast, dennoch fehlen mir hier noch ein paar erklärungen. ich rate jetzt mal, du hast CREATE GLOBAL TEMPORARY TABLE angewendet, um eine tabelle zu erstellen, die anschliessend wieder gelöscht werden soll? verwendest du ON COMMIT DELETE ROWS, um bei beenden der session die tabelle löschen zu lassen, oder versuchst du die anschliessend manuell zu löschen? Leider hab ich keine ahnung wie ich es anstelle das ich das ergebnis so sehe wie wenn ich select * from emp mache. die einzige ausgabemöglichkeit die ich gefunden habe ist dbms_output.put_line... aber das hilft mir nicht. du kannst eine FUNCTION bauen, welche dir im prinzip dieselben daten zurückgibt wie eine TABLE oder eine VIEW. du machst dann halt kein "select * from tab", sondern "select * from <deine funktion die dir datensätze liefert>". aber ich brauch halt den tabellenname der sich aus 'tmp_' + datum (ohne .) d.h. dein tabellenname (jeder der temp. tabelle) setzt sich aus bestimmten kriterien, in deinem fall das tagesdatum, zusammen? so jetzt möchte ich nach dem anzeigen die tabelle wieder löschen, geht aber ohne name nicht. name ist aber weg weil ich ja zwischendrin den block beendet habe um die daten anzuzeigen. temp. tabellen werden von oracle nach beenden der sitzung ohnehin gelöscht. s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 28. August 2006 Autor Teilen Geschrieben 28. August 2006 prinzipiell verstehe ich, was du vorhast, dennoch fehlen mir hier noch ein paar erklärungen. gut ich rate jetzt mal, du hast CREATE GLOBAL TEMPORARY TABLE angewendet, um eine tabelle zu erstellen, die anschliessend wieder gelöscht werden soll? verwendest du ON COMMIT DELETE ROWS, um bei beenden der session die tabelle löschen zu lassen, oder versuchst du die anschliessend manuell zu löschen? ok, ich machs nicht so ... ich hab mich heut zum ersten mal mit sowas auseinander gesetzt... also Selects und so einzeln kannte ich schon. Ich sehe das ich jetzt noch was zum nachschauen habe du kannst eine FUNCTION bauen, welche dir im prinzip dieselben daten zurückgibt wie eine TABLE oder eine VIEW. du machst dann halt kein "select * from tab", sondern "select * from <deine funktion die dir datensätze liefert>". wie mach ich das? einfach immer einen satz returnen? d.h. dein tabellenname (jeder der temp. tabelle) setzt sich aus bestimmten kriterien, in deinem fall das tagesdatum, zusammen? es können ja mehrere user eine abfrage starten, damit sich die spalten nicht vermischen mach ich das so mit datum und uhrzeit. ich hab halt eine reelle tabelle erzeugt und dort dynamisch die spalten angepasst. temp. tabellen werden von oracle nach beenden der sitzung ohnehin gelöscht. wie gesagt hab ich reelle erstellt. Erstma danke, du hast mir genug infos gegeben das ich da selber suchen kann .. melde mich wieder wenn ichs geschafft habe oder nicht schönen Feierabend. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 30. August 2006 Autor Teilen Geschrieben 30. August 2006 Hallo, ich bekomms nicht hin. Wie und wo soll ich so eine Temporary Table erstellen? Mir ist die Funktionsweise noch nicht bekannnt. Wie sieht die Funktion aus mit der ich select * from meineFunktion() aufrufe?? Evlt sogar mit übergabeparameter?? oder geht das dann genauso? Ich möchte keine Komplettlösung, nur ich komm nicht weiter. Wenn vllt. jemand einen guten Link hat, nur her damit. Bin für jede Hilfe dankbar. Danke schom mal im Voraus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 30. August 2006 Autor Teilen Geschrieben 30. August 2006 Also ich hab folgendes: create or replace function result_table return date is Result VARCHAR2(30); v_tmp_name VARCHAR(30); v_sql_str VARCHAR(500); CURSOR c1 IS SELECT hiredate FROM emp; hiredate emp.hiredate%TYPE; BEGIN v_tmp_name := 'nsql_tmp_' || to_char(SYSDATE,'ddmmyyyyhhmmss'); dbms_output.put_line('Ziel...: ' || v_tmp_name); v_sql_str := 'CREATE GLOBAL TEMPORARY TABLE ' || v_tmp_name || ' ( tage DATE ) ON COMMIT PRESERVE ROWS'; dbms_output.put_line('SQL....: ' || v_sql_str); EXECUTE IMMEDIATE v_sql_str; OPEN c1; LOOP FETCH c1 INTO hiredate; EXIT WHEN c1%NOTFOUND; dbms_output.put_line('Daten: ' || hiredate); v_sql_str := 'INSERT INTO ' || v_tmp_name || ' VALUES (''' || hiredate || ''')'; dbms_output.put_line('SQL....: ' || v_sql_str); EXECUTE IMMEDIATE v_sql_str; END LOOP; CLOSE c1; RETURN(v_tmp_name); end result_table; [/PHP] Aufruf: select * from nsql_result_table Da kommt die Meldung ORA-04044 Hab jetzt kein Plan was ich jetzt machen soll. ich brauch halt den richtigen rückgabetyp... aber wie mach ich das? danke schon mal im voraus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 31. August 2006 Autor Teilen Geschrieben 31. August 2006 Hi, ich hab ein Levelup ^^ also hier steht wie man Tabellen Funktionen schreibt... http://www.oracle-base.com/articles/9i/PipelinedTableFunctions9i.php bei mir war das Problem das ich Oracle 8i verwendet habe, man aber mindestens Oracle 9i verwenden muss... hab mir dann schnell zugang zum 10g verschafft und jetzt geht alles... das mit den global temorary tables lass ich jetzt weg... ich füge zu begin eine zeile ein in der dann die userspezifischen headers stehen. mit pipe row(my_type('meine überschrift spalte1',...,'meine überschrift spaltenn'); danke für die Unterstützung. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.