AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi spinnt fb oder spinn ich?
Thema durchsuchen
Ansicht
Themen-Optionen

spinnt fb oder spinn ich?

Ein Thema von sancho1980 · begonnen am 16. Okt 2006 · letzter Beitrag vom 18. Okt 2006
Antwort Antwort
Seite 1 von 3  1 23      
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#1

spinnt fb oder spinn ich?

  Alt 16. Okt 2006, 13:16
Datenbank: firebird • Version: 1.5 • Zugriff über: ibx, ibexpert
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:
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
ich gebe ein beispiel, wo diese prozedur das falsche ergebnis liefert (dazu die Test-Datenbank runterladen):

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:

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; aber das wäre bei großen datenmengen zu langsam... (aber daran seht ihr wenigstens nochmal genau, was die sp genau machen soll)

weiß hier irgendeiner weiter?

danke,

martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#2

Re: spinnt fb oder spinn ich?

  Alt 16. Okt 2006, 15:09
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!
Angehängte Dateien
Dateityp: dll fbintl2_425.dll (12,0 KB, 5x aufgerufen)
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: spinnt fb oder spinn ich?

  Alt 16. Okt 2006, 15:16
-Warum hängst du die datenbank nicht an den Artikel an?
-Warum verwendest du nicht das Limit/Row-Feature von FireBird?
Markus Kinzler
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#4

Re: spinnt fb oder spinn ich?

  Alt 16. Okt 2006, 15:37
row gibtst bei fb 1.5 nicht

erweiterung fdb ist als anhang verboten
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: spinnt fb oder spinn ich?

  Alt 16. Okt 2006, 15:46
Zitat von sancho1980:
row gibtst bei fb 1.5 nicht
Die alte Syntax sollte aber auch bei FB1.5 gehen, sonst -> Update auf 2 (RC5 ist ja das letzte vor der Final)
Zitat:
erweiterung fdb ist als anhang verboten
Dann Zippe sie doch.
Markus Kinzler
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#6

Re: spinnt fb oder spinn ich?

  Alt 16. Okt 2006, 15:48
besser?
Angehängte Dateien
Dateityp: rar demodeen_517.rar (121,8 KB, 6x aufgerufen)
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: spinnt fb oder spinn ich?

  Alt 17. Okt 2006, 17:52
Hallo,

ich verstehe die SP einfach nicht.
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.
Heiko
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#8

Re: spinnt fb oder spinn ich?

  Alt 17. Okt 2006, 18:13
hi

die sp erklären is ganz einfach; was sie machen soll ist:

SQL-Code:
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 problem ist, dass meine felder zuu groß sind - deswegen kann ich auf asterm, id keinen joint index kreiren.
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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: spinnt fb oder spinn ich?

  Alt 17. Okt 2006, 18:17
Der Titel ist schon mal echt gut. 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 ? 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#10

Re: spinnt fb oder spinn ich?

  Alt 17. Okt 2006, 18:30
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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  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 10:23 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