MaxDB 7.6.0.12
SqlStudio 7.6.0.12

Good morning,

Few days ago I posted a question about a misbehaviour of one of my functions. I tried to reproduce the problem with the test HOTEL database and the results are still wrong :

With the Try...Catch statement surrounding the While loop the function doesn't return anything. If I remove the Try...Catch statement (including the loop it contains) the function works as expected

Could someone help me to understand what my mistake with this Try...Catch block is ?

When I create a stored procedure( REMPLACEFONCTIONPROC ). It works.

Thanks in advance.
Kind Regards

Vincent Robidet


CREATE FUNCTION REMPLACEFONCTION(DFORMULE VARCHAR) RETURNS VARCHAR AS
VAR
    FA  VARCHAR(255);
    ROWID CHAR(8) BYTE;

/* Stores the parameter */
SET FA = DFORMULE;
/* Creates a temporary table*/
TRY CREATE TABLE TEMP.COPIEFONCTION(ZIP CHAR(5), NAME CHAR(20)); CATCH
   IF $RC <> 0 THEN STOP ($RC, 'Unexpected error 2');

TRY
   /* Copy a part of the CITY table to the COPIEFONCTION table */
   INSERT INTO TEMP.COPIEFONCTION SELECT ZIP, NAME FROM HOTEL.CITY;
/* Useless loop which creates a cursor on the COPIEFONCTION table and DELETE one by one all the rows */
   /* The problem is here */
    WHILE $RC<>100 DO
    BEGIN

       DECLARE CFONCTION CURSOR FOR SELECT SYSKEY FROM TEMP.COPIEFONCTION;

       FETCH CFONCTION INTO :ROWID;
       DELETE FROM TEMP.COPIEFONCTION WHERE SYSKEY = :ROWID;
/* should I delete the cursor ? */
    END;

CATCH
   IF $RC <> 100 THEN STOP ($RC, 'Prob dans la boucle');


/* Drops the EMPTY COPIEFONCTION table */
TRY
   DROP TABLE TEMP.COPIEFONCTION;
CATCH
   IF $RC <> 0 THEN STOP ($RC, 'Unexpected error3');


/* Returns the primary parameter */
TRY
   RETURN FA;
CATCH
   IF $RC <> 0 THEN STOP ($RC, ' prob return ');


CREATE DBPROC REMPLACEFONCTIONPROC(IN DFORMULE VARCHAR(255), OUT SFORMULE VARCHAR(255))AS
 VAR
 FA  VARCHAR(255);
 ZI  CHAR(5);
 NA  CHAR(20);
 ROWID CHAR(8) BYTE;

SET FA = DFORMULE; TRY CREATE TABLE TEMP.COPIEFONCTION(ZIP CHAR(5), NAME CHAR(20)); CATCH
IF $RC <> 0 THEN STOP ($RC, 'Unexpected error 2');


/* Problem in function*/
TRY
/*Liste des fonctions dans la table formule*/
 INSERT INTO TEMP.COPIEFONCTION SELECT ZIP, NAME FROM HOTEL.CITY;

 WHILE $RC<>100 DO
 BEGIN

    DECLARE CFONCTION CURSOR FOR SELECT SYSKEY   FROM TEMP.COPIEFONCTION;

    FETCH CFONCTION INTO :ROWID;
    DELETE FROM TEMP.COPIEFONCTION WHERE SYSKEY = :ROWID;

 END;

CATCH
IF $RC <> 100 THEN STOP ($RC, 'Prob dans la boucle');
/* problem in function*/



TRY
DROP TABLE TEMP.COPIEFONCTION;
CATCH
IF $RC <> 0 THEN STOP ($RC, 'Unexpected error3');

TRY
SET SFORMULE = FA;
CATCH
IF $RC <> 0 THEN STOP ($RC, ' prob return ');




Reply via email to