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 ');