Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird on external (https://www.delphipraxis.net/186947-firebird-external.html)

Dumpfbacke 15. Okt 2015 07:24

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX

Firebird on external
 
Hallo liebe Delphianer,
könntet Ihr mit bitte erneut bei einem Problem helfen. Ich habe hier zwei Datenbanken mit jewals Tabelen. Ich möchte nun ein Ergebnis erhalten was Daten aus den beiden Datenbanken beinhaltet. Leider geht ja ein einfacher Join über zwei Datenbank nicht. Ich habe hier gelesen das es über on external gehen soll. Kann ich in dem Block auch parameter übergeben oder geht das nicht ? Die Daten kann ich nicht einfach in einer Datenbank verarbeiten da die Daten der Datenabk 2 für verschiede andere Datenbanken benötigt werden und einmal in der Woche geändert werden müssen. Dieses möchte ich wenn möglich nur in einer Datenbak machen und nicht in allen.

Hier mal ein sehr vereinbfachtes Beispiel:

zwei Datenbankt mit jewals Tabelle.

Datenbank 1
Tabelle Waren
Felder: WarenArt, Beschreibung, usw.

Datenbank 2
Tabelle Lager
Felder: WarenArt, Gebaeude,Raum,Reihe,Regal.


Ich möchte nur eine Abfrage starten wo ich die Warenart übergebe. Als Ergebnis möchte ich dann Erhalten:

Warenart,Beschreibung,Gebaeude,Raum,Reihe,Regal. usw.

Der Inhalt von Warenart in der Datenbank 2 gibt es jewals nur ein mal in der Tabelle.



Hier das Beispiel was ich hierzu gefunden haben, jedoch ohne Parameter zu übergeben.

execute block returns (emp_no smallint) as
begin
FOR EXECUTE STATEMENT 'select emp_no from employee'
ON EXTERNAL DATA SOURCE 'localhost:employee' AS USER 'sysdba' PASSWORD 'masterkey'
INTO :emp_no
DO SUSPEND;
end


Danke schon mal an Euch für die Antworten.

Neutral General 15. Okt 2015 07:43

AW: Firebird on external
 
Du hast halt ein EXECUTE STATEMENT. Parameter kannst du hier nicht verwenden, aber das Statement selbst ist ja nur ein String.
Also kannst du sowas machen wie:

Code:
FOR EXECUTE STATEMENT 'SELECT * FROM lager WHERE lager.warenart = ''' || :warenart || '''' ON ...

Lemmy 15. Okt 2015 07:53

AW: Firebird on external
 
warum muss das unbedingt über eine Abfrage laufen? Frag doch beide DBs getrennt ab und führe das Ergebnis in deiner Client-Anwendung zu einem Resultset zusammen....

Dumpfbacke 15. Okt 2015 09:16

AW: Firebird on external
 
Zitat:

Zitat von Lemmy (Beitrag 1318754)
warum muss das unbedingt über eine Abfrage laufen? Frag doch beide DBs getrennt ab und führe das Ergebnis in deiner Client-Anwendung zu einem Resultset zusammen....

Ich wolte es gene mit einem Select machen. Die Auswertung der ersten Dantenbak ergibt ca. 460 Datensätze. Somit müsste ich dann 460 Select auf die zweit DB jagen und das wollte ich sparen. Ansonsten muss ich halt auf die Version 3 warten hier sollte zumindest nach eine Aussage von einiger Zeit eine Join zwischen zwei Datenbanken möglich sein. Als alternative könnte ich mir noch eine UDF erstellen. Das muss ich mir noch mal durch den Kopf gehen lassen.

FBrust 15. Okt 2015 09:29

AW: Firebird on external
 
Hallo,

hier der Link zur Firebird-FAQ:http://www.firebirdfaq.org/faq16/

Steht im Grunde auch nur das drin, was im ersten Posting schon als Beispiel genannt wurde, von daher scheint das auch der Weg zu sein (zumindest in Version 2.5).

Gruß
Frank

Lemmy 15. Okt 2015 09:33

AW: Firebird on external
 
Zitat:

Zitat von Dumpfbacke (Beitrag 1318764)
Zitat:

Zitat von Lemmy (Beitrag 1318754)
warum muss das unbedingt über eine Abfrage laufen? Frag doch beide DBs getrennt ab und führe das Ergebnis in deiner Client-Anwendung zu einem Resultset zusammen....

Ich wolte es gene mit einem Select machen. Die Auswertung der ersten Dantenbak ergibt ca. 460 Datensätze. Somit müsste ich dann 460 Select auf die zweit DB jagen und das wollte ich sparen. Ansonsten muss ich halt auf die Version 3 warten hier sollte zumindest nach eine Aussage von einiger Zeit eine Join zwischen zwei Datenbanken möglich sein. Als alternative könnte ich mir noch eine UDF erstellen. Das muss ich mir noch mal durch den Kopf gehen lassen.

warum musst Du 460 Selects auf die zweite DB jagen?

Erste DB auslesen in Klassenstruktur packen, zweite DB auslesen, dazu packen und gut ist... WEnn Du das nicht willst, dann kannst Du auch mit einer InMemorytabelle arbeiten. Gut, wenn das Live-Daten sein sollen, die du verändern willst, würde ich eher wieder ein ORM bemühen...

Neumann 15. Okt 2015 10:03

AW: Firebird on external
 
Es geht auch mit Stored Procedures. Hier mal ein Beispiel, wie aus mehreren Datenbanken Informationen abgerufen und in eine temp. Tabelle geschrieben werden:

Code:
SET TERM ^ ;

CREATE OR ALTER PROCEDURE P_FILIALZAHLART (
    s timestamp,
    p timestamp,
    db varchar(200))
as
declare variable znr integer;
declare variable rsumme numeric(15,4);
begin
    for
    execute statement ('select zahlartnr, sum(Betrag) from kbzahlungen where datum between :s and :p group by zahlartnr')
    (s:=s,p:=p)
    on external data source :db as user 'sysdba' password 'masterkey'
    into :znr,:rsumme do
    begin
      insert into kbzahlungenfilial(zahlartnr,betrag) values(:znr,:rsumme);
    end

end^

SET TERM ; ^


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz