![]() |
Datenbank: firebird • Version: 1.5 • Zugriff über: ibx, ibexpert
spinnt fb oder spinn ich?
hi leute
ich versuche grad eine sp gebacken zu bekommen und werd langsam verrückt. grund: die sp läuft im ibexpert-debugger tadellos, aber wenn sie von firebird selbst ausgeführt wird, ist die ergebnismenge nicht korrekt. habe eine test-datenbank, in der befinden sich unter anderem die felder asterm und id die erwähnte prozedur soll folgendes tun: dem benutzer sollen die nächsten 20 eintrag-ids aus tabelle dicentries zurückgeliefert werden; sortiert nach "asterm ascending, id ascending" die parameter asterm_in und id_in bestimmen hierbei den einsprungspunkt in die tabelle, AB DEM die 20 einträge zurückgegeben werden sollen die prozedur sieht folgendermaßen aus:
SQL-Code:
ich gebe ein beispiel, wo diese prozedur das falsche ergebnis liefert (dazu die
CREATE PROCEDURE NEXT_20_AB_ASTERM (
asterm_in varchar(240), id_in bigint) returns ( id_out bigint, pos integer) as declare variable id_prior bigint; declare variable asterm_temp varchar(240) character set unicode_fss; declare variable asterm_prior varchar(240) character set unicode_fss; begin pos = 0; ASTERM_prior = ASTERM_in; id_prior = id_in; for select ASTERM from dicentries where ((ASTERM = :ASTERM_prior and id >= :id_prior) or (ASTERM > :ASTERM_prior)) order by ASTERM ascending into :ASTERM_temp do begin if (ASTERM_temp > ASTERM_prior) then id_prior = 0; for select id from dicentries where ASTERM = :ASTERM_temp and id >= :id_prior order by id ascending into :id_out do begin suspend; pos = pos + 1; if (pos = 20) then exit; end id_prior = id_out + 1; asterm_prior = asterm_temp; end end ![]() select * from next_20_ab_asterm('Lackreiniger, m', 34) das korrekte ergebnis (so wie es auch im ibexpert-debugger ausgegeben wird) ist: id_out 34 167 117 59 91 123 143 141 185 219 206 207 1 223 213 177 175 130 90 110 firebird 1.5 selbst aber gibt mir folgendes (falsches) ergebnis: id_out 34 167 117 59 143 141 185 219 206 207 177 130 90 110 222 82 79 211 212 210 Ich weiß, dass ich diese sp auch einfacher haben könnte, nämlich in der art:
SQL-Code:
aber das wäre bei großen datenmengen zu langsam... (aber daran seht ihr wenigstens nochmal genau, was die sp genau machen soll)
for select first 20 id from dicentries where (asterm = :asterm_in and id >= :id_in) or (asterm > :asterm_in) order by asterm ascending, id ascending into :id_out do suspend;
weiß hier irgendeiner weiter? danke, martin |
Re: spinnt fb oder spinn ich?
Liste der Anhänge anzeigen (Anzahl: 1)
jetzt fällt mir ein, warum ihr vielleicht nicht antwortet: ihr braucht ja noch die collation: einfach fbintl2.dll in euer firebird-intl verzeichnis kopieren und server neu starten, dann geht die test-datenbank!
|
Re: spinnt fb oder spinn ich?
-Warum hängst du die datenbank nicht an den Artikel an?
-Warum verwendest du nicht das Limit/Row-Feature von FireBird? |
Re: spinnt fb oder spinn ich?
row gibtst bei fb 1.5 nicht
erweiterung fdb ist als anhang verboten |
Re: spinnt fb oder spinn ich?
Zitat:
Zitat:
|
Re: spinnt fb oder spinn ich?
Liste der Anhänge anzeigen (Anzahl: 1)
besser?
|
Re: spinnt fb oder spinn ich?
Hallo,
ich verstehe die SP einfach nicht. :wall: Erklär doch mal genau, was du willst. Dann checke mal die einzelnen SQL-Abfragen einzeln. (per suspend in Hilfs-Return-Parametern) Bau dir doch eine oder mehrere Hilfsvariablen als Return-Varsd ein, zum "debuggen". Das der Debugger was anderes anzeigt, kann vorkommen, die FB ja keinen Debugger-Unterstützung hat. Das was ibexpert macht, ist clientseitiges debuggen (oder udf glaueb ich). Was anderes fällt mir noch zum Thema connection stirng ein, hast du im ibexpert den charset bei den Registrierungs-optionen direkt mit angegeben ? Dann musst du das auch in deiner App machen. läuft denn die sp korrekt in ibexpert ohne debugger ? Heiko PS: In meiner DB sind auch ein paar sp's. |
Re: spinnt fb oder spinn ich?
hi
die sp erklären is ganz einfach; was sie machen soll ist:
SQL-Code:
das problem ist, dass meine felder zuu groß sind - deswegen kann ich auf asterm, id keinen joint index kreiren.
pos = 0;
for select first 20 id from dicentries where (asterm = :asterm_in and id >= :id_in) or (asterm > :asterm_in) order by asterm ascending, id ascending into :id_out do begin suspend; pos = pos + 1; end das wiederum bedeutet, dass die prozedur so wie sie hier steht zu lange dauern würde; deswegen brauch ich eine andere sp, die mir genau das selbe ergebnis liefert - aber dabei schneller ist! habe mittlerweile eine lösung gefunden, die funktioniert..bin immer noch der meinung, das was ich hier gepostet hab ist korrekt und firebird hat einen bug...sei's drum, so funktioniert's jetzt (indem ich das problem in zwei prizeduren aufteile):
SQL-Code:
CREATE PROCEDURE NEXT_20_AB_ASTERM_AUX (
asterm_in varchar(240), id_in bigint) returns ( id_out bigint, pos integer) as declare variable cnt integer; declare variable asterm_tmp varchar(240) character set unicode_fss; declare variable asterm_prior varchar(240) character set unicode_fss; begin pos = 0; cnt = 0; asterm_prior = asterm_in; for select asterm, id from dicentries where (asterm = :asterm_in and id >= :id_in) or (asterm > :asterm_in) order by asterm ascending into :asterm_tmp, :id_out do begin cnt = cnt + 1; if (asterm_tmp <> asterm_prior) then begin pos = pos + 1; asterm_prior = asterm_tmp; end suspend; if (cnt = 20) then exit; end end
SQL-Code:
CREATE PROCEDURE NEXT_20_AB_ASTERM (
asterm_in varchar(240), id_in bigint) returns ( id_out bigint, pos integer) as begin pos = 0; for select id_out from next_20_ab_asterm_aux(:asterm_in, :id_in) order by pos ascending, id_out ascending into :id_out do begin suspend; pos = pos + 1; end end |
Re: spinnt fb oder spinn ich?
Der Titel ist schon mal echt gut. :stupid: Zeige mal, wie das ganze im Programm aussieht. Sind die Parameter tatsächlich richtig bestückt im Programm ? IBExpert macht nichts anderes, als Dein Programm auch (machen soll), Debugger hin oder her. Der Hund dürfte bei Dir begraben sein. Ich sehe dann noch Unicode in Verbindung mit IBX ? Geht das überhaupt ? Savepoints bei FB1.5 gehen mit IBX jedenfalls nicht. Und Unicode soll gehen ? :shock: Da würde ich mich mal genau vergewissern. Ok, Glaskugel gibt nicht viel mehr her. Könnte mir allerdings vorstellen, daß es Schwierigkeiten mit IBX/Unicode gibt und das gar nicht auffällt, weil eventuell dubiose Datensätze wegen der Begrenzung der Datenmenge am Schluß angezeigt werden, also quasi unsichtbar.
|
Re: spinnt fb oder spinn ich?
wieso? es funktioniert doch jetzt
außerdem ist der ibexpert debugger ein separates programm der sich u.U. anders verhalten kann als es fb letzten endes tut :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 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-2025 by Thomas Breitkreuz