Entwickler-Ecke

Datenbanken - kann ich eigene funktionen im select aufrufen? Wenn ja wie?


CenBells - Di 22.10.02 18:43
Titel: kann ich eigene funktionen im select aufrufen? Wenn ja wie?
Hallo

ich habe eine procedure get_min_val, welche zwei ints bekommt und das kleinere von beiden zurückliefert.

select g.nationalitaet,
sum( get_min_val('31.10.2002'- '01.10.2002', b.auszug_datum - b.einzug_datum)) as Tage
from belegungen b, gaeste g
where ((b.einzug_datum <= '31.10.2002') and ((b.auszug_datum >= '01.10.2002') OR (b.auszug_datum is null)))
and g.gaeste_key = b.gaeste_key
Group by g.nationalitaet

nun würde ich gerne dieses statement ausführen. Kann ich das und wenn ja wie? so gibt es den fehler unbekanntes symbol get_min_val

gruß
Ken


LCS - Mi 23.10.02 08:19

Hi
Versuchs mal mit

Quelltext
1:
2:
3:
4:
5:
6:
select g.nationalitaet, 
sum( execute procedure get_min_val ('31.10.2002'- '01.10.2002'), (b.auszug_datum - b.einzug_datum)) as Tage 
from belegungen b, gaeste g 
where ((b.einzug_datum <= '31.10.2002') and ((b.auszug_datum >= '01.10.2002') OR (b.auszug_datum is null))) 
and g.gaeste_key = b.gaeste_key 
Group by g.nationalitaet

Konnte ich nicht testen, müsste aber funktionieren.

Gruss Lothar


CenBells - Do 24.10.02 12:22

danke, aber dann bekomme ich in isql den fehler
unbekannter Token execute

Kannst du damit was anfangen?


LCS - Do 24.10.02 12:33

Hm, ne...war nen Versuch wert :?

Ich hab das so allerdings auch noch nie gemacht. Da müsste ich auch erst mal damit experimentieren.

Gruss Lothar


Udontknow - Do 24.10.02 12:55

fast richtig! Man muss die Prozedur wie eine normale Tabelle behandeln!


Quelltext
1:
2:
3:
4:
5:
6:
select g.nationalitaet, 
sum( select [b]Ergebnis[/b] from get_min_val ('31.10.2002'- '01.10.2002'), (b.auszug_datum - b.einzug_datum)) as Tage 
from belegungen b, gaeste g 
where ((b.einzug_datum <= '31.10.2002') and ((b.auszug_datum >= '01.10.2002') OR (b.auszug_datum is null))) 
and g.gaeste_key = b.gaeste_key 
Group by g.nationalitaet


Ergebnis ist in diesem Falle das Ausgabefeld der Prozedur.

Cu,
Udontknow


CenBells - Do 24.10.02 16:27

hallo,

danke für den hinweis.
ich habe das getestet, abe dann kommt die fehlermeldung unbekannter token select


Quelltext
1:
2:
3:
4:
5:
6:
select g.nationalitaet,
sum( select * from get_min_val ('31.10.2002'- '01.10.2002'), (b.auszug_datum - b.einzug_datum)) as Tage
from belegungen b, gaeste g
where ((b.einzug_datum <= '31.10.2002') and ((b.auszug_datum >= '01.10.2002') OR (b.auszug_datum is null)))
and g.gaeste_key = b.gaeste_key
Group by g.nationalitaet


LCS - Fr 25.10.02 06:44

Hi
ich hab gestern einige Zeit damit verbracht das auszutesten mit dem Ergebnis, dass ich kein Ergebnis habe. :?
Prozeduren, die aus einem Programm ausgerufen werden oder die direkt mit den Daten arbeiten sind kein Problem. Prozeduren die wie eine Funktion ein Ergebnis innerhalb eines Select-Statements zurückliefern machen die merkwürdigsten Sachen.
Ich denke, ich werde mich übers Wochenende mal näher mit den UDFs beschäftigen, denn das scheint mir der beste Lösungsansatz zu sein.

Gruss Lothar


Udontknow - Fr 25.10.02 08:14

Hmmm, kann gut sein, dass es so nicht funzt, ich benutze Prozedurergebnisse meist nur in der Where-Klausel, da funktioniert es dann aber auch hunderprozentig.

Überhaupt, warum machst du nicht für diese Berechnung eine Prozedur?

Cu, :)
Udontknow


CenBells - Fr 25.10.02 10:08

habe ja auch ein prozedur gemacht, aber ich dachte, so eine minimum von zwei werten funktion wäre richtig schick und könnte man oft mal gebrauchen

Gruß
Ken


Udontknow - Fr 25.10.02 10:16

Kannst du doch auch benutzen. Nur eben nicht in einer Summierung eines Select-Statements.


Lemmy - Fr 25.10.02 12:01

Damit müsste es doch gehen:

Quelltext
1:
2:
3:
4:
5:
select g.nationalitaet, sum(v.Ergebnis) as Tage
from belegungen b, gaeste g, get_min_val('31.10.2002'- '01.10.2002', b.auszug_datum - b.einzug_datum) v
where ((b.einzug_datum <= '31.10.2002') and ((b.auszug_datum >= '01.10.2002') OR (b.auszug_datum is null)))
and g.gaeste_key = b.gaeste_key
Group by g.nationalitaet


Zumindest funzt das so immer bei meinen SP.

Ach ja, besser ist aber:


Quelltext
1:
2:
3:
4:
5:
select g.nationalitaet, sum(v.Ergebnis) as Tage
from belegungen b join gaeste g ON g.gaeste_key = b.gaeste_key
get_min_val('31.10.2002'- '01.10.2002', b.auszug_datum - b.einzug_datum) v
where ((b.einzug_datum <= '31.10.2002') and ((b.auszug_datum >= '01.10.2002') OR (b.auszug_datum is null)))
Group by g.nationalitaet