AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi krieg die sp nicht gebacken
Thema durchsuchen
Ansicht
Themen-Optionen

krieg die sp nicht gebacken

Ein Thema von sancho1980 · begonnen am 20. Mai 2006 · letzter Beitrag vom 21. Mai 2006
Antwort Antwort
sancho1980

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

krieg die sp nicht gebacken

  Alt 20. Mai 2006, 17:23
Datenbank: firebird 1.5 • Zugriff über: ibx, ibexpert
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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Hoshy

Registriert seit: 27. Apr 2006
32 Beiträge
 
Delphi 7 Architect
 
#2

Re: krieg die sp nicht gebacken

  Alt 20. Mai 2006, 19:19
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
  Mit Zitat antworten Zitat
sancho1980

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

Re: krieg die sp nicht gebacken

  Alt 20. Mai 2006, 19:34
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)
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
sancho1980

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

Re: krieg die sp nicht gebacken

  Alt 20. Mai 2006, 23:36
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...
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#5

Re: krieg die sp nicht gebacken

  Alt 21. Mai 2006, 00:38
Schuss ins blaue: die Schnittmenge bekommst du mit einem InnerJoin, nicht leftJoin
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
Hansa

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

Re: krieg die sp nicht gebacken

  Alt 21. Mai 2006, 02:54
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 ? 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: krieg die sp nicht gebacken

  Alt 21. Mai 2006, 03:12
Vielleicht hilft dir ja so was...

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

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

Re: krieg die sp nicht gebacken

  Alt 21. Mai 2006, 12:48
ich habs raus!!!

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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:36 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