AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Select Statement in Stored Procedures
Thema durchsuchen
Ansicht
Themen-Optionen

Select Statement in Stored Procedures

Ein Thema von alleinherrscher · begonnen am 30. Jul 2012 · letzter Beitrag vom 30. Jul 2012
Antwort Antwort
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

Select Statement in Stored Procedures

  Alt 30. Jul 2012, 14:53
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX
Hi@all!

Versuche gerade, eine Stored Procedure zu schreiben, die von meiner Anwendung eine Liste von E-Mails (Absenderid und Timestamp) bekommt, und der Reihe nach Überprüfen soll, ob diese Adressen schon in einer Tabelle hinterlegt sind. Ich habe auf euer Anraten hierfür eine SP verwendet, um die Geschwindigkeit Datenübertragnung zu optimieren.

Dafür gibt es while schleife, die zunächst aus dem übergebenen String ein einzelnen variablen parst und dann die Datenbank abfragen soll. Allerdings meckert hier Firebird immer, ich sollte ein SUSPEND Statement verwenden. Dessen Verwendung führt allerdings natürlich jedes mal dazu, dass der Code nach dem Select (bzw die While schleife) nicht mehr weiter ausgeführt wird. Was kann man dagegen unternehmen.

Code:
RECREATE PROCEDURE IS_EMAIL_IN_DB (Str VARCHAR(32664))
  RETURNS (MAIL_IN_DB VARCHAR(32765)) AS
DECLARE VARIABLE CUSTOMER_ID VARCHAR(10);
DECLARE VARIABLE MAIL_DATE VARCHAR(100);
DECLARE VARIABLE j INTEGER;
DECLARE VARIABLE anzahl INTEGER;
DECLARE VARIABLE adatetime TIMESTAMP;
BEGIN
  IF (STR IS NULL)
  THEN BEGIN MAIL_IN_DB = ''; EXIT; END
 
  MAIL_IN_DB='';
 
  WHILE (CHAR_LENGTH(Str)>0) DO BEGIN

    EXECUTE PROCEDURE POS(',',Str) RETURNING_VALUES :J;
    If (j=0 AND CHAR_LENGTH(Str)>0) then BEGIN j= Char_LENGTH(str)+1; END  
    CUSTOMER_ID = SUBSTRING(Str FROM 1 FOR j-1);
    Str = SUBSTRING(Str FROM j+1 FOR CHAR_LENGTH(Str)-j);

    EXECUTE PROCEDURE POS(',',Str) RETURNING_VALUES :J;
    If (j=0 AND CHAR_LENGTH(Str)>0) then BEGIN j= Char_LENGTH(str)+1; END  
    MAIL_DATE = SUBSTRING(Str FROM 1 FOR j-1);
    Str = SUBSTRING(Str FROM j+1 FOR CHAR_LENGTH(Str)-J);

    adatetime=CAST(MAIL_DATE AS TIMESTAMP);
   
    for select count(*) from DOCUMENTS WHERE CUSTOMER = :CUSTOMER_ID
    AND MODIFYDATE = :adatetime INTO :anzahl
    DO
      suspend; <--- ergibt fehlermeldung ohne SUSPEND
       
    MAIL_IN_DB = MAIL_IN_DB || CAST(anzahl as VARCHAR(1)); <---- wird nie erreicht

  END

END

Wenn ihr hier einen Tipp für mich hättet, wäre ich sehr sehr dankbar!

Gruß, Michael
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#2

AW: Select Statement in Stored Procedures

  Alt 30. Jul 2012, 15:10
setz mal das suspend vor das letzte End
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Select Statement in Stored Procedures

  Alt 30. Jul 2012, 15:14
Nur das Suspend verschieben wird nichts bringen, so sollte das klappen was Du willst:

Code:
RECREATE PROCEDURE IS_EMAIL_IN_DB (Str VARCHAR(32664))
  RETURNS (MAIL_IN_DB VARCHAR(32765)) AS
DECLARE VARIABLE CUSTOMER_ID VARCHAR(10);
DECLARE VARIABLE MAIL_DATE VARCHAR(100);
DECLARE VARIABLE j INTEGER;
DECLARE VARIABLE anzahl INTEGER;
DECLARE VARIABLE adatetime TIMESTAMP;
BEGIN
  IF (STR IS NULL)
  THEN BEGIN MAIL_IN_DB = ''; EXIT; END
 
  MAIL_IN_DB='';
 
  WHILE (CHAR_LENGTH(Str)>0) DO BEGIN

    EXECUTE PROCEDURE POS(',',Str) RETURNING_VALUES :J;
    If (j=0 AND CHAR_LENGTH(Str)>0) then BEGIN j= Char_LENGTH(str)+1; END
    CUSTOMER_ID = SUBSTRING(Str FROM 1 FOR j-1);
    Str = SUBSTRING(Str FROM j+1 FOR CHAR_LENGTH(Str)-j);

    EXECUTE PROCEDURE POS(',',Str) RETURNING_VALUES :J;
    If (j=0 AND CHAR_LENGTH(Str)>0) then BEGIN j= Char_LENGTH(str)+1; END
    MAIL_DATE = SUBSTRING(Str FROM 1 FOR j-1);
    Str = SUBSTRING(Str FROM j+1 FOR CHAR_LENGTH(Str)-J);

    adatetime=CAST(MAIL_DATE AS TIMESTAMP);
   
    select count(*) from DOCUMENTS WHERE CUSTOMER = :CUSTOMER_ID
    AND MODIFYDATE = :adatetime INTO :anzahl;
       
    MAIL_IN_DB = MAIL_IN_DB || CAST(anzahl as VARCHAR(1)); <---- wird nie erreicht

  END
  suspend;
END
die For Select ist nichts anderes als ne Schleife, die durchlaufen wird. Das brauchst Du aber an der Stelle nicht, sondern ein einfaches Select. Erst wenn die SP abgearbeitet ist, brauchst Du das Suspend, damit der RÜckgabewert auch beim Client ankommt....
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Select Statement in Stored Procedures

  Alt 30. Jul 2012, 15:21
setz mal das suspend vor das letzte End
Oh man, soo einfach? Okay, ich dachte das suspend wäre fester bestandteil der For Select Anweisnung. Bedankt!!!!
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  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:15 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