An example of using a scrollable cursor in RPG was requested. Here is the example I had in my archives. I apologize it's not free format, but it is easily converted should you want to do that.
This example also uses CGIDEV2 as it is a web application. If you were using it as a subfile application you would need to find other ways to retrieve/store PerPage and LastRRN (and FirstRRN if you want to be able to page backwards).
* Read Records Per Page and Last RRN from Web Page
*
C eval PerPage = c2n2(ZhbGetVar('PerPage'))
C eval LastRRN = c2n2(ZhbGetVar('LastRRN'))
*
* Do some checking to make sure PerPage is > 0, if not, set it to a default
*
* Build Dynamic SQL into DynSQL String Making sure to get the RRN of each record as well
* Select field1, field2,... rrn(FILE) from FILE where... order by...
* optimize for [perpage] rows for read only
*
C/EXEC SQL
C+ PREPARE S1 FROM :DynSQL
C/END-EXEC
*
C/EXEC SQL
C+ DECLARE C1 INSENSITIVE SCROLL CURSOR FOR S1
C/END-EXEC
*
C/EXEC SQL
C+ OPEN C1
C/END-EXEC
*
C/EXEC SQL
C+ FETCH RELATIVE :LastRRN
C+ FROM C1
C+ INTO :field1, field2,... :FileRRN
C/END-EXEC
*
C dow (SQLCOD <> 100) and (Count < PerPage)
C eval Count = (Count + 1)
C eval LastRRN = (LastRRN + 1)
*
* Do Processing for each record
*
C/EXEC SQL
C+ FETCH
C+ FROM C1
C+ INTO :field1, field2,... :FileRRN
C/END-EXEC
*
C enddo
C/EXEC SQL
C+ CLOSE C1
C/END-EXEC
*
* write out the LastRRN to the page so it can be retrieved on the next call.
*