Zum Inhalt springen

(Oracle) anonyme Blöcke


Maulwurf_der_Schlaue

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...