Please enable JavaScript to view this site.

R:BASE 11 Help

Navigation: Reference Index > Multi-User Guide > Increasing Application Performance

Using Nested Cursors

Scroll Prev Top Next More

Nested cursors must be used correctly for efficient execution of code. Notice how the following examples use the DECLARE CURSOR command differently. Both examples work correctly, but only the second attains normal processing speed.

 

In Example 9, the DECLARE CURSOR is placed inside the WHILE loop of the first cursor. This requires the second DECLARE CURSOR command to execute every time the first command finds a row. In Example 10, both DECLARE CURSOR commands are executed at the start of the program, and the second DECLARE CURSOR command is opened inside the WHILE loop of the first command. By restricting the second DECLARE CURSOR from executing as often, this example runs much faster.

 

SET VAR t1 TIME = NULL

SET VAR t2 TIME = NULL

SET VAR vDiff INTEGER = NULL

 

--Example 9 - Slow

SET VAR t1 = (.#TIME)

DECLARE c1 CURSOR FOR SELECT State, StCode +

FROM States +

WHERE State IN ('Washington', 'Oregon', 'California')

OPEN c1

WHILE SQLCODE = 0 THEN

FETCH c1 INTO vState INDICATOR ivState, +

 vStCode INDICATOR ivStCode

IF SQLCODE <> 0 THEN

BREAK

ENDIF

DECLARE c2 CURSOR FOR SELECT Runway +

FROM Airports WHERE StCode = .vStCode

OPEN c2

SET VAR vLength = 0

WHILE SQLCODE = 0 THEN

FETCH c2 INTO vRunway INDICATOR ivRunway

IF SQLCODE = 0 THEN

IF vRunway > 5000 THEN

SET VAR vRunway = (.vRunway + 100)

ELSE

SET VAR vRunway = (.vRunway + 50)

ENDIF

UPDATE Airports SET Runway = (.vRunway) +

WHERE CURRENT OF c2

ENDIF

ENDWHILE

DROP CURSOR c2

ENDWHILE

DROP CURSOR c1

SET VAR t2 = (.#TIME)

SET VAR vDiff = (.t2 - .t1)

SET VAR vTime = (RTIME(0,0,.vDiff))

PAUSE 2 USING .vTime

 

--Example 10 - Faster

SET VAR t1 = (.#TIME)

SET VAR vRunway INTEGER = NULL, vStCode INTEGER = NULL

DECLARE cursl CURSOR FOR SELECT State, StCode +

FROM States +

WHERE State IN ('Washington', 'Oregon', 'California')

DECLARE c2 CURSOR FOR SELECT Runway FROM Airports +

WHERE StCode = .vStCode

OPEN c1

WHILE SQLCODE = 0 THEN

FETCH c1 INTO vState INDICATOR ivState, +

 vStCode INDICATOR ivStCode

IF SQLCODE <> 0 THEN

BREAK

ENDIF

OPEN c2

SET VAR vLength = 0

WHILE SQLCODE = 0 THEN

FETCH c2 INTO vRunway

IF SQLCODE = 0 THEN

IF vRunway > 5000 THEN

SET VAR vRunway = (.vRunway + 100)

ELSE

SET VAR vRunway = (.vRunway + 50)

ENDIF

UPDATE Airports SET Runway = (.vRunway) +

WHERE CURRENT OF c2

ENDIF

ENDWHILE

CLOSE c2

ENDWHILE

DROP CURSOR c1

SET VAR t2 = (.#TIME)

SET VAR vDiff = (.t2 - .t1)

SET VAR vTime = (RTIME(0,0,.vDiff))

PAUSE 2 USING .vTime