speechfree
Goto Top

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 face-smile

Content-ID: 82541

Url: https://administrator.de/contentid/82541

Ausgedruckt am: 26.11.2024 um 09:11 Uhr

SvenGuenter
SvenGuenter 07.03.2008 um 11:27:14 Uhr
Goto Top
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
Biber
Biber 07.03.2008 um 11:42:46 Uhr
Goto Top
@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
SpeechFree
SpeechFree 07.03.2008 um 12:00:21 Uhr
Goto Top
@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?
Ist nicht gewünscht.

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?
Ein Oracle Server
Wieviele Instanzen? Datenbanken? Tabellen?
Datensätze eher im Milliarden oder nur
im Millionenbereich?
Im Millionenbereich
Von welchem OS auf welches Zielsystem?
OS ist Windows
Oder auf welches Medium? Auf Festplatte? Auf
DVD? Auf den HOST?
Die Dateien werden in einem Ordner pro Firma auf einem Fileserver abgelegt.

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

Das ganze soll Server seitig realisiert werden.
Das Ziel ist: In der Datenbank liegen Tabellen in denen Prduktdaten von Firmen liegen. Durch die SQL Abfragen werden die Marktanteile an den Produkten der einzelnen Firmen ermittelt und noch viele marktwichtige Daten mehr.

Pro Firma soll eine Ordner entstehen der drei CSV enthält. Es sind 17 verschiedene Firmen. Diese Prozedur läuft einmal im Monat ab. D.H es sind 51 CSV-Dateien im Monat. Bzw. 51 Abfragen. Die Abfragen sind immer gleich nur die Parameter ändern sich so das die spezifische Firma ihre richtigen Daten enthält.

Im Moment wird das ganze durch ein DTS-Package realisiert, jedoch müssen da händisch Daten wie Monat etc angepasst werden. Dieses DTS läuft dann auf einem SQL-Server. Dieser Server soll komplett verschwinden. Da der eigentliche Datenbankserver wesentlich performanter ist.

Das Ziel sind genau die von dir beschriebenen PL/SQL-Prozeduren.
Wichtig ist das ganze einmal angestoßen wird und dann komplett automatisiert durchläuft, die Dateien mit dem richtigen Namen der richtigen Formatierung im richtigen Ordner sind. Ohne das irgendwelche Anpassungen vorgenommen werden.

Vielen Dank für eure Mühe


Euer
FS
SvenGuenter
SvenGuenter 07.03.2008 um 13:02:43 Uhr
Goto Top
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
SpeechFree
SpeechFree 07.03.2008 um 13:06:04 Uhr
Goto Top
Hi

offtopic:
ich finde das auch nicht gut. Es ist leider nicht so leicht als Anfänger, daß ganze gleich richtig zusammen zu fassen.
Wenn ich Zeit habe und Erfahrung , schreibe ich mal ein Tutorial wie man solche präzise Fragen stellt, bisher weiß ich das noch nicht. Trotzdem danke für deinen Ansatz.

Back to Topic:

Global ist das Datum das wichtigste.
Die Namenszusammensetzung der einzelnen ausgegebenen Dateien ist von Firma zu Firma unterschiedlich.
Die Anzahl der Firmen ist nicht feststehend sondern kann sich ändern, normalerweise jedoch statisch.
Die Version ist 10g.


Vielen Dank
FS
SvenGuenter
SvenGuenter 07.03.2008 um 13:12:18 Uhr
Goto Top
@fs

Sorry nochmal von mir. Man braucht kein Tutorial für Fragen sondern einfach nur infos über ein paar dinge.

Also nochmal zu deinem Problem

- Welcher Ora Server
- Hast du alle Daten die du brauchst in der DB oder musst du dir noch parameter von ausserhalb holen?


Gruß

Sven
SvenGuenter
SvenGuenter 07.03.2008 um 13:14:25 Uhr
Goto Top
^^ warst schneller hatte nur den ersten teil gesehen.

Das Datum willst du das aktuelle datum zum aufrauf haben oder den Vormonat.


Sprich soll der job am 01.04 laufen und den monat 03 auswerten oder soll der job am ende des monats 03 laufen und den monat 03 auswerten.


gruß

sven
SpeechFree
SpeechFree 07.03.2008 um 13:27:15 Uhr
Goto Top
Hi,

es wird immer der Vormonat produziert.

Die SQL-Statments sind immer gleich für jede Firma das einzige was sich ändert ist die Firmen ID.

MfG

FS
SvenGuenter
SvenGuenter 07.03.2008 um 14:08:04 Uhr
Goto Top
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
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
SpeechFree
SpeechFree 07.03.2008 um 14:34:52 Uhr
Goto Top
Hi ,

klingt gut face-smile

Ich habe jetzt mal grob überlegt wie ich mir das vorstelle.

Weiß natürlich nicht ob das funktioniert.


Das Datum zu bekommen hast du erklärt, das kann ich gut in das Sql-Statment einbasteln.

So jetzt zu dem kompletten Ablauf:


Variable sind das Datum und die Firmenid.

Datum ist abgearbeitet wird dann direkt in das vorhandene SQL-Statement übergeben.
Firmenip müssen festgelegt werden. Somit muss das Statement entsprechend oft der Firmenanzahl durchlaufen und die ID anpassen im SQL-Statement.

Die Daten werden erzeugt jetzt müssen die einzelnen Ordner bzw. Dateien erzeugt werden.
Dachte mir das könnte man evtl. wahrscheinlich muss man das sogar durch ein UTL_FILE erzeugen.

Zu bedenken ist, das das Programm vier verschiedene Prozeduren des o.g Typs abarbeiten muss.

Gruß
FS
SvenGuenter
SvenGuenter 07.03.2008 um 14:45:59 Uhr
Goto Top
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
SvenGuenter
SvenGuenter 07.03.2008 um 14:53:01 Uhr
Goto Top
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;
SpeechFree
SpeechFree 07.03.2008 um 14:58:37 Uhr
Goto Top
Hi,

wenn ich das richtig verstehe ziehen wir jetzt sämtliche unterschiedliche Firmenids aus der DB bzw. der Tabelle. Jedoch besteht die Tabelle aus sämtlichen Firmen die in diesem Markt sind und nicht alle kaufen Daten bei uns. D.H es sind nur 15 Kunden jedoch gibt es wesentlich mehr Firmen in den Tabellen.

Vielleicht habe ich aber auch den Code nicht verstanden.

Gruß
FS
SvenGuenter
SvenGuenter 07.03.2008 um 15:00:27 Uhr
Goto Top
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();
SvenGuenter
SvenGuenter 07.03.2008 um 15:03:18 Uhr
Goto Top
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