![]() |
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:
dann hab ich mir eine sp GET_DICENTRIES_BY_ASDSKRPT geschrieben, die geht so:
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^
SQL-Code:
die funktionieren erstmal so wie sie sollen...
CREATE PROCEDURE GET_DICENTRIES_BY_ASDSKRPT (
ASDSKRPTINPUT VARCHAR(15)) RETURNS ( ID BIGINT) AS begin ... suspend; end^ 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 |
Re: krieg die sp nicht gebacken
Zitat:
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 |
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) |
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... :-( |
Re: krieg die sp nicht gebacken
Schuss ins blaue: die Schnittmenge bekommst du mit einem InnerJoin, nicht leftJoin :gruebel:
|
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:
|
Re: krieg die sp nicht gebacken
Vielleicht hilft dir ja so was...
SQL-Code:
SELECT *
FROM dicentries WHERE '.' + :ASDSKRPTINPUT + '.' LIKE '%.' + CONVERT(VARCHAR, id) + '.%' |
Re: krieg die sp nicht gebacken
ich habs raus!!! :firejump:
falls es wen interessiert:
SQL-Code:
...aufzurufen mit GET_DICENTRIES_BY_ALL_ASDSKSRPT (1, ASDSKRPT)...
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^ fehlt nur noch, dass mir einer von euch sagt, er hätte's gewusst :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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