![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX
Select Statement in Stored Procedures
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 |
AW: Select Statement in Stored Procedures
setz mal das suspend vor das letzte End
|
AW: Select Statement in Stored Procedures
Nur das Suspend verschieben wird nichts bringen, so sollte das klappen was Du willst:
Code:
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....
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 |
AW: Select Statement in Stored Procedures
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 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