Oracle CSV Dateien erstellen PL-SQL
Hi,
ich habe mein erstes richtiges Projekt bekommen.
Folgendes: Ich soll ein Programm schreiben, das aus einer Orakel-DB Daten ausliest und als CSV in einer bestimmten Formatierung ausgibt.
Es sind mehrere Dateien pro Firma. Mehrere Firmen.
Mir geht es um eine Grundstruktur wie würdet ihr das ganze strukturieren?
MfG
FS
P.S
Ich weiß die Beschreibung ist erstmal sehr abstrakt, aber ihr habt bestimmt zielführende Fragen
ich habe mein erstes richtiges Projekt bekommen.
Folgendes: Ich soll ein Programm schreiben, das aus einer Orakel-DB Daten ausliest und als CSV in einer bestimmten Formatierung ausgibt.
Es sind mehrere Dateien pro Firma. Mehrere Firmen.
Mir geht es um eine Grundstruktur wie würdet ihr das ganze strukturieren?
MfG
FS
P.S
Ich weiß die Beschreibung ist erstmal sehr abstrakt, aber ihr habt bestimmt zielführende Fragen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 82541
Url: https://administrator.de/contentid/82541
Ausgedruckt am: 26.11.2024 um 09:11 Uhr
15 Kommentare
Neuester Kommentar
In welcher Programmiersprache soll das denn gemacht werden bzw. wie soll das ganze laufen? Als job auf einem Server auf der DB selber als Prozess auf einer adneren Maschine????
Ansonsten bau dir eine Oberfläche unter vb6 oder vb.net. Connection auf den Ora server.
Dann einfach
Recordset mit select füllen
Datei aufmachen
Nach und nach alle einträge des Recordsets in die datei schreiben
recordset schließen
datei schließen fertig.
Also irgendwie ist das doch nicht die Welt ausser da kommen nun noch Randbedingungen die das ganze aufbohren. Also bitte noch mehr Infos oder das Problem ist gelöst ;o)
Gruß
Sven
Ansonsten bau dir eine Oberfläche unter vb6 oder vb.net. Connection auf den Ora server.
Dann einfach
Recordset mit select füllen
Datei aufmachen
Nach und nach alle einträge des Recordsets in die datei schreiben
recordset schließen
datei schließen fertig.
Also irgendwie ist das doch nicht die Welt ausser da kommen nun noch Randbedingungen die das ganze aufbohren. Also bitte noch mehr Infos oder das Problem ist gelöst ;o)
Gruß
Sven
@SvenGuenter
Und wieso soll er das nicht mit PL/SQL zusammenschroten, wie im Titel angegeben?
Siehst Du irgendwo Bedarf für für eine interaktive Klicki-Bunti-Oberfläche?
WTF sollte jemand einen Massen-Export vom Client aus anstarten und sich eine Textdatei auf dem Client zusammenbraten?
Da gehen doch dann via DB-Connection ein paar GigaByte-Große Resultsets über die Leitung.
Nein, das ist serverseitig besser aufgehoben.
Da könnten ganz normale PL/SQL-Procedures laufen (wenn nicht sogar von Hand abgefeuerte SQL-Skripte) oder, als höchstes der Gefühle, vielleicht mit 10 Zeilen mehr eine STP, die noch ein paar Eingabeparameter zur Auswahl/Filterung verstehen kann.
@SpeechFree
Wovon reden wir denn? Ein oder mehrere Oracle-Server?
Wieviele Instanzen? Datenbanken? Tabellen? Datensätze eher im Milliarden oder nur im Millionenbereich?
Von welchem OS auf welches Zielsystem?
Oder auf welches Medium? Auf Festplatte? Auf DVD? Auf den HOST?
Vom Vorgehen her wäre erstmal die Klärung dieser paar Eckpfeiler wichtig.
Von einer Implentierungsfrage sind wir noch ein paar Postings entfernt.
Grüße
Biber
Und wieso soll er das nicht mit PL/SQL zusammenschroten, wie im Titel angegeben?
Siehst Du irgendwo Bedarf für für eine interaktive Klicki-Bunti-Oberfläche?
WTF sollte jemand einen Massen-Export vom Client aus anstarten und sich eine Textdatei auf dem Client zusammenbraten?
Da gehen doch dann via DB-Connection ein paar GigaByte-Große Resultsets über die Leitung.
Nein, das ist serverseitig besser aufgehoben.
Da könnten ganz normale PL/SQL-Procedures laufen (wenn nicht sogar von Hand abgefeuerte SQL-Skripte) oder, als höchstes der Gefühle, vielleicht mit 10 Zeilen mehr eine STP, die noch ein paar Eingabeparameter zur Auswahl/Filterung verstehen kann.
@SpeechFree
Wovon reden wir denn? Ein oder mehrere Oracle-Server?
Wieviele Instanzen? Datenbanken? Tabellen? Datensätze eher im Milliarden oder nur im Millionenbereich?
Von welchem OS auf welches Zielsystem?
Oder auf welches Medium? Auf Festplatte? Auf DVD? Auf den HOST?
Vom Vorgehen her wäre erstmal die Klärung dieser paar Eckpfeiler wichtig.
Von einer Implentierungsfrage sind wir noch ein paar Postings entfernt.
Grüße
Biber
Hi Biber,
das die Sachen Serverseitig besser aufgehoben sind ist mir klar. Ich habe evtl ein wenig überreagiert aber ich finde immer diese Postings:
Ich habe ein Problem helft mir und mehr infos bekommt Ihr nicht ein wenig nervig.
Da ein Ora Server im Gespräch war musste ja eine größere Datenmenge im Hintergrund sein.
Das zur Erklärung zu meiner 1. Antwort.
@fs
Welche Parameter sind denn wichtig für dich? Nur der Monat oder noch andere? Sind die Firmen immer die gleichen oder wechseln die? Wenn es nur die 17 Firmen oder aber die Frmendaten in der DB komplett vorhanden sind dann kann man das tatsächlich komplett automatisieren mit Jobs die du auf der DB liegen hast.
Interessant wäre da noch welche Ora Version du hast oder nutzen musst.
Gruß
Sven
das die Sachen Serverseitig besser aufgehoben sind ist mir klar. Ich habe evtl ein wenig überreagiert aber ich finde immer diese Postings:
Ich habe ein Problem helft mir und mehr infos bekommt Ihr nicht ein wenig nervig.
Da ein Ora Server im Gespräch war musste ja eine größere Datenmenge im Hintergrund sein.
Das zur Erklärung zu meiner 1. Antwort.
@fs
Welche Parameter sind denn wichtig für dich? Nur der Monat oder noch andere? Sind die Firmen immer die gleichen oder wechseln die? Wenn es nur die 17 Firmen oder aber die Frmendaten in der DB komplett vorhanden sind dann kann man das tatsächlich komplett automatisieren mit Jobs die du auf der DB liegen hast.
Interessant wäre da noch welche Ora Version du hast oder nutzen musst.
Gruß
Sven
Ok dann hier mal einen ansatz
select to_char(sysdate, 'MM'),to_char(sysdate, ''YYYY) from dual
damit holst du dir den monat und das Jahr
Jahr brauchst du wenn der Jahreswechsel ansteht.
Nun machst du ein Select passend zum monat und zum jahr auf deine tabelle und holst die alle FirmenID die in diesem Zeitpunkt auftauchen.
Diese dann auswerten. Pseudocodemäßig würde das so aussehen
Pseudocode
Das ist der Grund
Realisieren würde ich mir das folgendermaßen
holen des aktuellen jahres und des aktuellen monats. Speichern in einer jeweiligen variablen
Kurze plausiprüfung ob monat = 1 da ich dann auf 12 gehen muss und das jahr runtersetzen muss.
einen cursor aufmachen und diesen mit dem select füttern der mir die ID der firmen als vorgabe hat.
im cursor alle dateien zu der firmenid holen und zu dem monat und dem jahr.
Datensätze in Datei wegschreiben.
Cursor schließen.
Wenn du noch echten Quellcode brauchst einfach melden
select to_char(sysdate, 'MM'),to_char(sysdate, ''YYYY) from dual
damit holst du dir den monat und das Jahr
Jahr brauchst du wenn der Jahreswechsel ansteht.
Nun machst du ein Select passend zum monat und zum jahr auf deine tabelle und holst die alle FirmenID die in diesem Zeitpunkt auftauchen.
Diese dann auswerten. Pseudocodemäßig würde das so aussehen
Pseudocode
SELECT daten FROM TABLE WHERE monat = (select to_char(sysdate,'mm') -1 FROM dual )
and jahr = (select to_char(sysdate,'YYYY') FROM dual ) and firmenid in (select firmenid
from tabelle where monat = (select to_char(sysdate,'mm') -1 FROM dual )
and jahr = (select to_char(sysdate,'YYYY') FROM dual ))
Das ist der Grund
Realisieren würde ich mir das folgendermaßen
holen des aktuellen jahres und des aktuellen monats. Speichern in einer jeweiligen variablen
Kurze plausiprüfung ob monat = 1 da ich dann auf 12 gehen muss und das jahr runtersetzen muss.
einen cursor aufmachen und diesen mit dem select füttern der mir die ID der firmen als vorgabe hat.
im cursor alle dateien zu der firmenid holen und zu dem monat und dem jahr.
Datensätze in Datei wegschreiben.
Cursor schließen.
Wenn du noch echten Quellcode brauchst einfach melden
Hallo FS
Ich würde das echt mit nem Cursor machen. Ora ist da sehr performant.
sprich datum und jahr hast du.
nun ein open cursor with select distinct firmenid from tabelle where monat = variablemonat
and jahr = variablejahr
( Dies hat den vorteil das du nun alle vorkommenden firmenid's hast )
nun dein select mit der firmenid
schreibe daten in datei mit namen firmenid und datum select daten von tabelle where firmenid = cursorfirmenid and monat = variablemonat
and jahr = variablejahr
schreibe daten in datei mit namen firmenid und datum select nächstedatenauswahl von tabelle where firmenid = cursorfirmenid and monat = variablemonat
and jahr = variablejahr
nächster cursorsatz
( hier wird die nächste firmenid geholt)
cursor schließen.
Wie gesagt das ist textmäßig erklärt ich müßte mir auf anhieb auch noch die Syntax für den Cursor raussuschen. Aber damit hast du alles in einer query erledigt und musst keine 4 schreiben.
Gruß Sven
Ich würde das echt mit nem Cursor machen. Ora ist da sehr performant.
sprich datum und jahr hast du.
nun ein open cursor with select distinct firmenid from tabelle where monat = variablemonat
and jahr = variablejahr
( Dies hat den vorteil das du nun alle vorkommenden firmenid's hast )
nun dein select mit der firmenid
schreibe daten in datei mit namen firmenid und datum select daten von tabelle where firmenid = cursorfirmenid and monat = variablemonat
and jahr = variablejahr
schreibe daten in datei mit namen firmenid und datum select nächstedatenauswahl von tabelle where firmenid = cursorfirmenid and monat = variablemonat
and jahr = variablejahr
nächster cursorsatz
( hier wird die nächste firmenid geholt)
cursor schließen.
Wie gesagt das ist textmäßig erklärt ich müßte mir auf anhieb auch noch die Syntax für den Cursor raussuschen. Aber damit hast du alles in einer query erledigt und musst keine 4 schreiben.
Gruß Sven
Hier mal ein cursor
declare
v_jahr number;
v_monat number;
v_firmenid number;
cursor c_firmenid is
select distinct firmenid where monat = v_monat and jahr = v_jahr;
begin
OPEN c_firmenid;
loop
FETCH c_firmenid into v_firmenid;
exit when c_firmenid%NOTFOUND;
'Hier die anweisungen zum wegschrieben
end loop;
CLOSE c_firmenid;
end;
Hier ein Beispiel für Dateienschreiben
File ausgabeDatei = new File(context.getRealPath("report/report.csv"));
PrintWriter out = new PrintWriter(new FileWriter(ausgabeDatei));
String quote = "\"";
String sep = ";";
while (result.next()) {
for(int i = 1; i <= 23; i++)
out.print(quote + result.getString(i) + quote + sep);
outprintln();
}
out.close();
ich habe mit dem select der firmenid das so eingeschränkt wie ich infos hatte. Sprich alle Firmenid's die in diesem Monat aufgelaufen sind. Die Where Bedingungen musst du natürlich so definieren wie du sie brauchst das du nur die Firmenid's greifst die du benötigst.
Ich kenne ja auch die Tabellen nicht um dir da weiter helfen zu können. Es ist ein Ansatz,
Gruß
Sven
Ich kenne ja auch die Tabellen nicht um dir da weiter helfen zu können. Es ist ein Ansatz,
Gruß
Sven