SQL-Selektion in externe Datei schreiben

Alles, was den Programmierer beschäftigt

Moderator: SYNERPY

Antworten
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

SQL-Selektion in externe Datei schreiben

Beitrag von miboe » Sa Jan 05, 2013 11:52 am

Hallo zusammen,

ich bin gerade über eine Fragestellung gemäß Betreff gestolpert, für die ich keine Lösung finde. Deswegen frage ich hier mal nochmal nach, ob jemand sowas schonmal gemacht hat oder irgend eine Idee für mich hat:

Wie kann man aus einer Stored Procedure heraus Daten in eine externe Datei schreiben um diese dann zum Beispiel von einer anderen Anwendung weiter verarbeiten zu lassen? Oder im einem Trigger?

Viele Anwendungen sind ja in der Lage ein bestimmtes Verzeichnis abzupollen und dann mit einer dort aufschlagenden Datei was zu veranstalten. Und da frage ich mich jetzt, wie ich zum Beispiel in einem AFTER INSERT Trigger (z.B. für Ansprechpartner --> CRM) oder in einer Prozedur für einen nächtlichen Job, eine solche Datei schreiben kann.

Das ganze wäre schick mit normalen Firebird Bordmitteln und wenn möglich ohne zusätzliche Script-Bibliotheken.

Viele Grüße
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3

UliS
Beiträge: 395
Registriert: Fr Mai 26, 2006 3:44 pm
Wohnort: Velbert-Langenberg

Ausgabe auf Datei mit isql

Beitrag von UliS » Sa Jan 05, 2013 7:05 pm

Hallo Michael,
wie wärs mit isql:

Getestet über:cmd öffnet Console
(Pfade anpassen..)
isql -q -i test.sql -o test.txt

-q(uiet) um keinen connect-Prompt zu bekommen.
denn der connect steckt im
-i(nput) file test.sql

>CONNECT 'localhost:C:\Program Files (x86)\AVERP\AvERP_DEMO.FDB' USER 'SYSDBA' PASSWORD 'masterkey';
>
>SELECT a.MASKENKEY, a.INTERNE_KURZNOTIZ FROM A_MASKEN A ORDER BY MASKENKEY;

Erzeugt dann
-o(utput) in Datei test.txt wie:

MASKENKEY INTERNE_KURZNOTIZ
======================================== ========================================
FRDBABES Rahmenauftrag
FRDBABES_BESTELLUNG Rahmenauftrag
FRDBADRAD Adressetiketten
FRDBADRBRIEF Anschreiben
FRDBADRBRIEF_ALT Anschreiben - alt
FRDBANFLIEF Anfrage (Lieferant)
FRDBANFLIEF_ALT Anfrage (Lieferant) - alt
FRDBANFPO Anfrage drucken
FRDBANFPO_ANFRAGE Anfrage drucken
FRDBANF_UEBERSICHT Preisvergleich
FRDBANLVBAPROB Etikett drucken
FRDBANLVBA_BEST Übertragungs- / Übernahmebestätigung
FRDBANLVBA_BIO Einsatzstofftagebuch für Biomasseanlagen
FRDBANLVBA_LISTE Bestandsaufzeichnung
FRDBANLVWP Wartungsplan
FRDBARTG1_BRRCP Umsatzauflistung
FRDBARTLHBUX Lagerentnahmen - LA01
FRDBARTLH_ETIKETT Artikeletikett
FRDBARTLH_ETT_SMB Lageretikett mit Barcode
FRDBARTPH_PREISLISTE Preisliste

MASKENKEY INTERNE_KURZNOTIZ
======================================== ========================================
FRDBARV_LISTE1 Ausrüstungsvorschrift - Liste1
FRDBAUF Angebot
Gruß U.Schmidt
http://averpen4dummies.blogspot.de/

Wenn ich weiß, wo ich suchen muß ist OpenSource besser als jede Dokumentation

aktuelle Erkenntnisse mit:
Software-Version 6.9.2
FDB 2020.02

miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe » So Jan 06, 2013 9:42 am

Stimmt daran hatte ich gar nicht gedacht ... und das obwohl ich bei mir isql benutzte um auf einem Linux Server den Jobserver zu ersetzen. Ich muss mir dann mal in Ruhe die Parameter anschauen.

Damit wäre dann noch offen, wie man so was in einem Trigger lösen könnte. Ein "Umweg" könnte sein, im Trigger den String der Exportzeile fertig zusammen zu bauen und dann in eine (neue) Tabelle TEXPORT zu schreiben. Von dort könnte man das dann wieder mit der ISQL Sache im 5 Minuten Rhythmus abholen lassen. Die Tabelle TEXPORT könnte dabei im Minimalausbau mit genau 2 Feldern auskommen (ID und langes VARCHAR).

Ich denke das mal zu Ende und poste dann mal hier ein sinnvolles Konzept für sowas ...

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3

cpr
Beiträge: 137
Registriert: Mi Sep 01, 2010 9:31 pm

Beitrag von cpr » So Jan 06, 2013 5:06 pm

Ergebnis meiner ehemaligen Recherchen zum Thema "Schnittstellen", "Stammdaten-Schaukel" und "Auftragsimport":
"Firebird doesn't play well with others."

Ich würde der Einfachheit halber auch die AvERP-Datenbank "von aussen" abfragen lassen, cron-/taskgesteuert.

Mit minimaler Logik könnte in einem Skript auch auf neue Datensätze geprüft werden, obwohl "after insert"-trigger natürlich komfortabel sind.
Ein "after insert" ist aber nicht genug: "Was bei "after delete" oder "after update" im Zielsystem veranlassen?

Die dicke Firebird-Bibel von Helen Borrie hatte nix zu verraten;
Foren-Recherche in der FB-Welt nach der Möglichkeit, externe Java-Klassen anzusprechen waren erfolglos.

FB ist irgendwie viel zu tief in der Delphi-Welt... :(
OpenSource, aber von allen unbeachtet.
Keine Abstraktions-Layer in den üblichen Bibliotheken (iirc noch nicht einmal Hibernate mit voller Unterstützung).


Die grosse Lösung für die beschriebenen Schnittstellen: Ein Enterprise Service Bus -> z.B. mulesoft.org (tolle Lösung!)

Die funktionierende Lösung: Aus dem Umfeld "Business Warehouses" z.B. Pentaho Data Integration (früher: Kettle)
http://kettle.pentaho.com/ Das "most mature" OpenSource Paket, es gibt aber auch jede Menge kommerzieller Anbieter.


Warum ein Zusatzprogramm einführen?
- zeitgesteuerte Aufrufe
- (fast) beliebige Quellen und Ziele
- Mapping! (sicher, dass alle Zielsysteme alphanumerische Kundennummern vertragen? Wenn nicht: Einen "lookup" einbauen, mit n:m Query. *g*)
- "upsert" in "der Schnittstelle" behandelt, nicht im Quell- oder Zielsystem. Ich finde, die Unterscheidung in neue/geänderte/unveränderte/gelöschte Datensätze gehört NICHT in Quell- oder Ziel-System.


Alle "Datenschaukeln" mach ich erstmal mit Pentaho (siehe Nr. 2), wenn dem nichts anderes entgegensteht.
--
Client: 4.2.5.42
Datenbank AVERP2011-A.02

Antworten