Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi krieg die sp nicht gebacken (https://www.delphipraxis.net/69827-krieg-die-sp-nicht-gebacken.html)

sancho1980 20. Mai 2006 17:23

Datenbank: firebird 1.5 • Zugriff über: ibx, ibexpert

krieg die sp nicht gebacken
 
hallo

ich hab ein problem; ich komm hier irgendwie nicht mehr weiter:

habe eine sp tokenize, die sieht folgendermaßen aus:

SQL-Code:
CREATE PROCEDURE TOKENIZE (
    S VARCHAR(10000),
    DELIM CHAR(1))
RETURNS (
    ID INTEGER,
    TKN VARCHAR(10000))
AS
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE LEN INTEGER;
DECLARE VARIABLE FIRSTCHAR CHAR(1);
DECLARE VARIABLE S2 VARCHAR(10000);
begin
   ...
   SUSPEND;
end^
dann hab ich mir eine sp GET_DICENTRIES_BY_ASDSKRPT geschrieben, die geht so:

SQL-Code:
CREATE PROCEDURE GET_DICENTRIES_BY_ASDSKRPT (
    ASDSKRPTINPUT VARCHAR(15))
RETURNS (
    ID BIGINT)
AS
begin
  ...
  suspend;

end^
die funktionieren erstmal so wie sie sollen...
was ich jetzt brauche ist eine sp, die einen string entgegennimmt, der mit '.' in einzelne tokens eingeteilt ist (also beispielsweise 'bla.bli.blo.blu'; wobei die anzahl der tokens variabel ist), und die mir dann alle id aus tabelle dicentries zurückgibt, für die gilt:

dicentries.id € GET_DICENTRIES_BY_ASDSKRPT('bla') AND dicentries.id € GET_DICENTRIES_BY_ASDSKRPT('bli') AND dicentries.id € GET_DICENTRIES_BY_ASDSKRPT('blo') AND dicentries.id € GET_DICENTRIES_BY_ASDSKRPT('blu')


versteht ihr was ich meine?

danke,

martin

Hoshy 20. Mai 2006 19:19

Re: krieg die sp nicht gebacken
 
Zitat:

versteht ihr was ich meine?
Nö, ich versteht nicht, wo Dein Problem liegt...

Procedure Tokenize ist doch schon die Prozedur, die Deinen Gesamtstring entgegennimmt und in die einzelnen Token zerpflückt. Und die andere proc liefert zu jedem Token die ID aus der Tabelle dictentries, richtig? Was brauchst Du dann noch? Und brauchst Du unbedingt eine Stored proc, um die IDs aus dictentries zu ermitteln, mit einem SELECT würd's doch bestimmt auch gehen...

Gruß
Andi

sancho1980 20. Mai 2006 19:34

Re: krieg die sp nicht gebacken
 
hab mich schon gewundert, warum so lange keiner zurückschreibt:

GET_DICENTRIES_BY_ASDSKRPT ist NICHT dazu da, um mir zu sagen, ob ein token in dicentries enthalten ist..du hast recht; dazu hätte eine select gereicht...wer's genau wissen will:

SQL-Code:
CREATE PROCEDURE GET_DICENTRIES_BY_ASDSKRPT (
    ASDSKRPTINPUT VARCHAR(15))
RETURNS (
    ID BIGINT)
AS
begin
  for
    select d.id
    from dicentries d
    left join dskrptlink_dicentries dl on d.id = dl.id_dicentry
    left join dskrpts ds on dl.id_dskrpt = ds.id
    where ds.asdskrpt = :ASDSKRPTINPUT
    into :id
   do
  suspend;

end^

was das genau soll, würde zu lange dauern zu erklären - auf jeden fall macht die sp was sie machen soll

ich brauche jetzt also eine sp "get_dicentries_by_all_asdskrpts" die einen tokenized string (zum BEISPIEL: 'bla.bli.blo.blu') entgegenimmt, dann für JEDEN token CREATE PROCEDURE GET_DICENTRIES_BY_ASDSKRPT(token) ausführt und mir die SCHNITTMENGE daraus zurückgibt (aber so, dass die anzahl der token nicht auf vier beschränkt ist, sonder variabel ist)

die schnittmenge also aus:

select * from (CREATE PROCEDURE GET_DICENTRIES_BY_ASDSKRPT('bla')), select * from (CREATE PROCEDURE GET_DICENTRIES_BY_ASDSKRPT('bli')), select * from (CREATE PROCEDURE GET_DICENTRIES_BY_ASDSKRPT('blo')) und select * from (CREATE PROCEDURE GET_DICENTRIES_BY_ASDSKRPT('blu') zurückgibt)

sancho1980 20. Mai 2006 23:36

Re: krieg die sp nicht gebacken
 
ich habs leider immer noch nicht raus
genauso wie es union für die vereinigung zweier datenmengen in firebird gibt, muss es doch auch eins für die schnittmenge geben, oder? intersection isses jedenfalls nicht... :-(

webcss 21. Mai 2006 00:38

Re: krieg die sp nicht gebacken
 
Schuss ins blaue: die Schnittmenge bekommst du mit einem InnerJoin, nicht leftJoin :gruebel:

Hansa 21. Mai 2006 02:54

Re: krieg die sp nicht gebacken
 
Union hat mit einer Vereinigungsmenge nur bedingt was zu tun. Bei Union geht man davon aus, daß diverse gleich aufgebaute Teil-Datenmengen bereits existieren. Ist das der Fall, dann kann man die tatsächlich quasi "zusammenkippen" und hat nur noch eine. Vielleicht geht das mit INNER JOIN, aber Dein Problem besteht IMHO darin, daß Riesen-Dinger zusammengebaut werden, z.B. wozu als Parameter ein VARCHAR (10000) und an anderer Stelle 9-fache Joins ? :shock: Tip : im Zweifel auf Join verzichten und lieber längere Sachen zusammenbauen mit where, and, or usw. Wer schreiben lernen will fängt auch nicht zuerst mit Schreibmaschine an und kann nicht mal lesen. :mrgreen:

omata 21. Mai 2006 03:12

Re: krieg die sp nicht gebacken
 
Vielleicht hilft dir ja so was...

SQL-Code:
SELECT *
FROM dicentries
WHERE '.' + :ASDSKRPTINPUT + '.' LIKE '%.' + CONVERT(VARCHAR, id) + '.%'

sancho1980 21. Mai 2006 12:48

Re: krieg die sp nicht gebacken
 
ich habs raus!!! :firejump:

falls es wen interessiert:

SQL-Code:
CREATE PROCEDURE GET_DICENTRIES_BY_ALL_ASDSKSRPT (
    TKNID BIGINT,
    ASDSKS VARCHAR(10000))
RETURNS (
    IDOUT BIGINT)
AS
DECLARE VARIABLE TOKEN VARCHAR(10000);
DECLARE VARIABLE CNT BIGINT;
begin
  select count(id) from tokenize(:asdsks, '.') into cnt;
  if (:cnt = 0) then
    for select id from dicentries into idout do
      suspend;
  else
    begin
      select tkn from tokenize(:asdsks, '.') where id = :tknid into token;
      if (:cnt = :tknid) then
        for select id from get_dicentries_by_asdskrpt(:token) into idout do
          suspend;
      else
        for select id from get_dicentries_by_asdskrpt(:token) t1 inner join get_dicentries_by_all_asdsksrpt(:tknid + 1, :asdsks) t2 on t1.id = t2.idout into idout do
          suspend;
    end
end^
...aufzurufen mit GET_DICENTRIES_BY_ALL_ASDSKSRPT (1, ASDSKRPT)...


fehlt nur noch, dass mir einer von euch sagt, er hätte's gewusst :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:41 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