also man stelle sich eine tabele dicentries vor
diese tabelle hat unter anderem 2 felder: asterm und id
jetzt stelle man sich ein dbgrid vor, in dem 20 einträge sind...und zwar geordnet nach
order by asterm ascending, id ascending
wenn der user jetzt in dem grid nach oben scrollen will, sollen die vorherigen 20 einträge aus der tabelle gefetcht werden
das ganze geschieht, indem asterm und id vom obersten eintrag gelesen werden, und an eine sp mit namen get_prior_20 übergeben werden.
diese sp sieht bei mir folgendermaßen aus:
SQL-Code:
CREATE PROCEDURE GET_PRIOR_20 (
ASTERMIN VARCHAR(80) CHARACTER SET WIN1252,
IDIN BIGINT)
RETURNS (
ASTERMOUT VARCHAR(80) CHARACTER SET WIN1252,
IDOUT BIGINT)
AS
DECLARE VARIABLE CNT INTEGER = 0;
begin
for select first 20 id, asterm from
dicentries
where asterm = :astermin and id <= :idin
order by asterm descending, id descending
into idout, astermout
do
begin
cnt = :cnt + 1;
suspend;
end
for select first 20 id, asterm from
dicentries
where asterm < :astermin
order by asterm descending, id descending
into idout, astermout
do
begin
if (cnt = 20) then
exit;
cnt = :cnt + 1;
suspend;
end
end
wenn ich beispielsweise
select * from get_prior_20('ausdruck', 30)
aufrufe, bekomme ich die gewünschten einträge; nur eben in der falschen reihenfolge, denn im grid soll natürlich der zuerst gefetchte record an letzter stelle stehen...
bei dem versuch, die reihenfolge einfach umzukehren mittels
select * from get_prior_20('ausdruck', 30) order by asterm ascending, id ascending
wird die reihenfolge nach einem mir nicht ersichtlichen prinzip durcheinandergebracht!
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.