AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Thema durchsuchen
Ansicht
Themen-Optionen

Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

Ein Thema von Codehunter · begonnen am 20. Dez 2018 · letzter Beitrag vom 21. Dez 2018
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 12:31
Datenbank: Firebird • Version: 2.5.8 • Zugriff über: FIBPlus
Hallo!

Ich habe folgenden StoredProc-Body:
Code:
SELECT * FROM A WHERE NOT A.FELD1 IN (SELECT DISTINCT ´ID´ FROM AndereProzedur(IrgendeinParameter));
Ich frage mich jetzt, wie Firebird den Ablauf realisiert. Wird für jede einzelne Zeile in Tabelle A das SELECT DISTINCT... ausgeführt? Oder wird zuerst einmalig das Ergebnis aus AndereProzedur() geholt und dann immer gegen dieses Ergebnis geprüft? Hintergrund der Frage ist die Laufzeitoptimierung. AndereProzedur() ist nicht gerade von der schnellen Sorte, würde hier aber IMMER das selbe Ergebnis liefern. Falls Firebird also dieses Ergebnis für jede Zeile neu aus AndereProzedur() holen würde, dann müsste ich deren Ergebnis "zwischenparken". Also ungefähr so:
Code:
PARKPLATZ = (SELECT DISTINCT ´ID´ FROM AndereProzedur(IrgendeinParameter));
SELECT * FROM A WHERE NOT A.FELD1 IN PARKPLATZ;
Ich hoffe ihr versteht worauf ich hinaus will. Also eigentlich zwei Fragen: Erstens wie arbeitet Firebird diesen verschachtelten Query ab und zweitens, wie kann ich ein Unterergebnis in einer Variablen zwischenparken?

Grüße
Cody
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 12:41
Da Du einen Parameter da drin hast und die Proc sowieso auf sich potentiell ändernden Daten arbeitet, müsste es dauernd neu berechnet werden.
Ich weiß nicht, ob FB einen Mechnismus hat, mit dem es eine Funktionsergebnis als immutable deklarieren kann.
Ansonsten ist halt Handarbeit angesagt, mit Zwischentabelle und benutzerspezifischen Ergebniseinträgen.
Gruß, Jo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 12:51
Du könntest den Wert in einer Kontextvariable zwischenspeichern
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 13:05
cool, wusste nicht das Firebird das kann.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 13:48
Du könntest den Wert in einer Kontextvariable zwischenspeichern
Kannst du mal ein kurzes Beispiel geben? Geht das auch mit einer Ergebnismengen-RecordCount > 1?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 13:56
Ich glaube nicht, dass das geht.
Du kannst einen Wert speichern. Dazu kann man auch eine normale SP - Variable nehmen.
Aber das Ergebnis eines Select' s mit mehreren Ergebniszeilen Zeilen ist IMHO nicht möglich.

Man könnte für den Fall eine Temporäre Tabelle (z. B. "TMP$ID" mit FELD ID) anlegen mit den ID' s aus AndereProzedur füllen.

Dann halt: SELECT * FROM A WHERE NOT A.FELD1 IN (SELECT ´ID´ FROM TMP$ID);

Das wäre sicher erheblich schneller...

Frank
Frank Reim
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 14:10
In der ursprünglichen Frage ging es um einen Wert:
select rdb$set_context('USER_SESSION' //oder USER_TRANSACTION, '<Name der Variable>', <Wert>) from rdb$database; Mehrere Werte/Datensätze als Temp-Table
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 14:18
Geht denn Temptable in FB SP?
Aber es muss ja nicht temp sein, Hauptsache der Inhalt wird passend eingetragen (und gelöscht).

Frage wäre auch, was insgesamt der Zweck des Statements ist. Vielleicht tut es ja schon ein View oder eine Kombi View mit Context Variable..
Gruß, Jo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 14:29
Wenn man Zugriff auf den Source der SP hat wäre der beste Weg das Ergebnis für ID in einer loaklen Variable zu Speichern.

SQL-Code:
...
SELECT DISTINCT ´ID´ FROM AndereProzedur(IrgendeinParameter) into :ID;
 
SELECT * FROM A WHERE A.FELD1 <> :ID;
...
Oder mal Testen, wie gut optimiert wird
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"

  Alt 20. Dez 2018, 15:32
Ich habe es mal mit derived table getestet.
Es sollte so:

SQL-Code:
select a.* from tabelle a
join (select distinct 'idfrom andereprozedur(irgendeinparameter)) b on b.id = a.feld1
where p2.id is null
gehen.


Laut Leistungsananlyse von IBExpert nur jeweils 1 Durchlauf (mit meinen Testtabellen...

Frank
Frank Reim
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 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