![]() |
Rekursion in StoredProcedure vermeiden,aber wie
Hi
ich kömpfe immer noch mit meiner doch jetzt schon recht großen Prozedur. Leider ist meine bisher einzige lösung,das sie sich selbst rekursiv aufruft,aber das ist wohl tödlich :( (und verursacht die fehlermeldung "too many concurrent executions of the same request" Die Prozedur berechnet Summenzeilen aus rechnungen. Das ist auch kein Problem. Bloß wenn aus diesen Summenzeilen wieder summen gebildet werden sollen, stoße ich an meine Grenzen. denn diese "2 generation summenzeilen" kann ich nicht aus den rechnungen berechen, sondern aus der "ersten generation" summenzeilen...
SQL-Code:
CREATE PROCEDURE SUMMIEREN (
STELLE CHAR(9), JAHR INTEGER) RETURNS ( BEREICH INTEGER, BEZ CHAR(32), ALLES FLOAT, JAN FLOAT, FEB FLOAT, MAR FLOAT, APR FLOAT, MAI FLOAT, JUN FLOAT, JUL FLOAT, AUG FLOAT, SEP FLOAT, OKT FLOAT, NOV FLOAT, DEZ FLOAT) AS DECLARE VARIABLE SUBTRAHEND INTEGER; DECLARE VARIABLE MINUEND INTEGER; DECLARE VARIABLE ANZAHL INTEGER; DECLARE VARIABLE DIF2 INTEGER; DECLARE VARIABLE DIF1 INTEGER; DECLARE VARIABLE ISINHAUPTKEYS INTEGER; begin for select ID,BEZ from MAIN B where B.STELLE = :STELLE order by id into :BEREICH, :BEZ do begin select count(*) from vorgabe where ID = :bereich into :Anzahl; if (:ANZAHL = 1) then begin /* die direkten parents berechnen */ select count(*) from hauptkeys where ID = :bereich into :ISINHAUPTKEYS; if (:ISINHAUPTKEYS = 1) then begin select sum(R_ANZ * R_EPREIS) from RECHNUNG R, MAIN M where (R.stelle = :Stelle) and (M.stelle = R.Stelle) and (R.bereich = M.ID) and (M.parent = :BEREICH) and (EXTRACT(YEAR from R.R_Datum) = :Jahr) and (EXTRACT(MONTH from R.R_Datum)=1) into :JAN; select sum(R_ANZ * R_EPREIS) from RECHNUNG R, MAIN M where (R.stelle = :Stelle) and (M.stelle = R.Stelle) and (R.bereich = M.ID) and (M.parent = :BEREICH) and (EXTRACT(YEAR from R.R_Datum) = :Jahr) and (EXTRACT(MONTH from R.R_Datum)=12) into :DEZ; suspend; end else begin /* "=" zeilen berechnen */ select max (id) from hauptkeys where id < :bereich into :minuend; select parent from hauptkeys where id = :bereich into :subtrahend; select JAN from SUMMIEREN(:stelle, :jahr) where (bereich = :minuend) into dif1; select JAN from SUMMIEREN(:stelle, :jahr) where (bereich = :subtrahend) into dif2; JAN = :DIF1 -:DIF2; suspend; end end else begin select sum(R_ANZ * R_EPREIS) from RECHNUNG R where (R.bereich = :BEREICH) and (R.stelle = :Stelle) and (EXTRACT(YEAR from R.R_Datum) = :Jahr) and (EXTRACT(MONTH from R.R_Datum)=1) into :JAN; select sum(R_ANZ * R_EPREIS) from RECHNUNG R where (R.bereich = :BEREICH) and (R.stelle = :Stelle) and (EXTRACT(YEAR from R.R_Datum) = :Jahr) and (EXTRACT(MONTH from R.R_Datum)=12) into :DEZ; suspend; end end end Das Problem ist der rekursive Aufruf bei /* "=" zeilen berechnen */ Dieser wäre im Grunde nicht nötig, denn die dort geholten werte,die dif1 und dif2 zugewiesen werden, sind in der aktuellen instanz schon fertig berechnet und vorhanden,aber ich komm ja nicht mehr an die ran. oder doch? Oder gibts ne elegantere Lösung? |
Re: Rekursion in StoredProcedure vermeiden,aber wie
Hi,
von dem mal abgesehen, dass ich nicht kapiere was Du berechnen willst, solltest Du ganz "normal" innerhalb einer SP mit dem Variablenname auf eine Variable zugreifen können. Teil weise musst Du nen : vor den Namen setzen. Wenn Deine fertigen Summen also in den Variablen "JAN" und "DEZ" stehen erhälst Du so die Differenz: Differenz= :JAN - :DEZ; nur hast Du an der Stelle eigentlich noch keien JAN bzw. DEZ, da es der else-Zweig einer if-Verzweigung ist und vor der IF zählst Du nur irgendwelche Datensätze... Grüße Lemmy |
Re: Rekursion in StoredProcedure vermeiden,aber wie
wenn die for schleife einmal abgearbeitet ist,habe ich ein n-Tupel (die ganzen return werte) Wenn jetzt die for schleife 10 mal abgearbeitet ist,habe ich also schon 10 Datensätze,die die Prozedur ausgespuckt hat. AN DIESER STELLE NUN hätte ich aber gern den datensatz 2(also den den die Prozedur nach dem zweiten durchlauf der for schleife ausgegeben hat)
Intuitiv würde ich ihn über den befehl
SQL-Code:
holen,denn das feld bereich identifiziert diesen datensatz eindeutig. Aber wie gesagt,rufe ich damit ja die prozedur wieder auf,und das geht schief.
select JAN from SUMMIEREN(:stelle, :jahr) where (bereich = :minuend) into dif1;
Meine frage ist im grunde: Gibt es sowas:
SQL-Code:
Ich hoffe ich konnte dir bissl klar machen was ich will.
select JAN from bereits_ermittelte_ergebnismenge where bereich = :minuend
|
Re: Rekursion in StoredProcedure vermeiden,aber wie
Guten Morgen,
ich glaube du hast einen Denkfehler (oder ich habe Dich falsch verstanden!): Der DO-Bereich einer For-Select SChleife wird bei jedem einzelnen Datensatz durchlaufen, wie bei Delphi eben (FOR i:=1 to 10 DO). Was ich immer noch nicht ganz kapiert habe (liegt vielleicht an der Uhrzeit ;-) ) willst Du nur den 2. Datensatz der 10 haben, oder den 2. Datensatz an der 11. Stelle nochmal? Im ersten Fall kannst Du das einfach mit einer entsprechenden Select machen, mit der Du die StoredProcedure aufrufst (aus dem Client heraus). Grüße Lemmy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz