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....