Filip Sergeys wrote :

>Hello,

>2 questions again:

>1) Are nested while loops possible or not?
>I have followed the recommendation in this mail
>(http://archives.neohapsis.com/archives/dev/sapdb/2003-q3/0743.html) and
>named each select (see 'code snipped' below) but I have the same problem
>as the poster it iterates once (1 time) and then exits.
>I also tried with IF $RC=0 THEN BEGIN... just behind the FETCH.
>What are the possibilities for nested while loops?

We have no indication that nested loop are not possible. 
If the inner loop in your example terminates, error 100
is thrown by the fetch statement and the catch handler
is executed. This means that the outer loop is also terminated.
You therefore should do without a TRY/CATCH block   
Please try the following code : 

DECLARE REQID CURSOR FOR SELECT DISTINCT(A.REQUESTID) AS REQUESTID
FROM DELTA.T_REQUEST A, DELTA.T_REQUEST B, COMMON.T_OFFICE B1,
COMMON.T_EMPLOYEE B2, DELTA.T_REQUEST C
WHERE B.REQUESTID=A.REQUESTID
AND B1.OFFICEID=A.VALUE
AND B2.EMPLOYEEID=B.VALUE
AND C.REQUESTID=A.REQUESTID
AND A.KEY = 'OFFICEID'
AND A.VALUE = :officeid
AND B.KEY = 'EMPLOYEEID'
AND B.VALUE = :employeeid
AND B1.KEY = 'DESCRIPTION'
AND B2.KEY = 'NAME'
AND C.KEY = 'REQUEST_TYPE'
AND C.VALUE= :reqtype
ORDER BY REQUESTID ASC;
WHILE $RC=0 DO BEGIN
    FETCH REQID INTO :requestid;
    IF $RC <> 0 THEN BREAK;
    DECLARE GTXT CURSOR FOR SELECT TRIM(C.TXT)
        FROM DELTA.L_RQTE3GUARANTEE A, COMMON.T_E3GUARANTEE B,
COMMON.T_MESSAGELNG C
        WHERE A.IDE3=B.IDE3
        AND B.SEQMSGTEXT = C.SEQMSG
        AND A.REQUESTID = :requestid
        AND C.SEQLNG = :language;
        WHILE $RC=0 DO BEGIN
            FETCH GTXT INTO :guarantee;
            IF $RC <> 0 THEN BREAK;
            SET GUARANTEETXT = GUARANTEETXT&' '&GUARANTEE;
            UPDATE TEMP.BOREQSELECT SET GUARANTEETXT = :guaranteetxt
            WHERE REQUESTID = :requestid;
            IF $RC <> 0
            THEN
                STOP (-31001, 'unexpected error in update ' || chr($rc));
            SET GUARANTEETXT = '0';
       END;
       IF $RC = 100 THEN $RC = 0;
END;
IF $RC<>100 THEN STOP($RC, 'THE GUARANTEE COMPOSITION FAILED');

>2) concatenating 2 variables in a dbproc
>e.g.: 
> FETCH GTXT INTO :guarantee;
> SET GUARANTEETXT = GUARANTEETXT&' '&GUARANTEE;

>I tried it the like in a select (select column1&' '&column2 from ...)
>but it returns a `?` instead of the concatenated string.
>I also tried it like described in string functions
>http://www.mysql.com/documentation/maxdb/ed/0df209d90e11d5994500508b6b8b11/content.htm
>SET GUARANTEETXT = GUARANTEETXT & GUARANTEE;
>but also not correct.
>What is the correct way to obtain a concatenated string in a dbproc?

Probably you did not initialize the variable GUARANTEETXT. In this case
GUARANTEETXT is null and the concatanation yields null also.

Regards,

Thomas


===code snipped============
TRY
DECLARE REQID CURSOR FOR SELECT DISTINCT(A.REQUESTID) AS REQUESTID
FROM DELTA.T_REQUEST A, DELTA.T_REQUEST B, COMMON.T_OFFICE B1,
COMMON.T_EMPLOYEE B2, DELTA.T_REQUEST C
WHERE B.REQUESTID=A.REQUESTID
AND B1.OFFICEID=A.VALUE
AND B2.EMPLOYEEID=B.VALUE
AND C.REQUESTID=A.REQUESTID
AND A.KEY = 'OFFICEID'
AND A.VALUE = :officeid
AND B.KEY = 'EMPLOYEEID'
AND B.VALUE = :employeeid
AND B1.KEY = 'DESCRIPTION'
AND B2.KEY = 'NAME'
AND C.KEY = 'REQUEST_TYPE'
AND C.VALUE= :reqtype
ORDER BY REQUESTID ASC;
WHILE $RC=0 DO BEGIN
    FETCH REQID INTO :requestid;
        DECLARE GTXT CURSOR FOR SELECT TRIM(C.TXT)
        FROM DELTA.L_RQTE3GUARANTEE A, COMMON.T_E3GUARANTEE B,
COMMON.T_MESSAGELNG C
        WHERE A.IDE3=B.IDE3
        AND B.SEQMSGTEXT = C.SEQMSG
        AND A.REQUESTID = :requestid
        AND C.SEQLNG = :language;
        WHILE $RC=0 DO BEGIN
            FETCH GTXT INTO :guarantee;
            SET GUARANTEETXT = GUARANTEETXT&' '&GUARANTEE;
            UPDATE TEMP.BOREQSELECT SET GUARANTEETXT = :guaranteetxt
WHERE REQUESTID = :requestid;
            SET GUARANTEETXT = '0';
       END;
END;
CATCH
IF $RC<>100 THEN STOP($RC, 'THE GUARANTEE COMPOSITION FAILED');
===code snipped===

-- 
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
* System Engineer, Verzekeringen NV *
* www.verzekeringen.be              *
* Oostkaai 23 B-2170 Merksem        *
* 03/6416673 - 0477/340942          *
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*


-- 
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

-- 
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to