Fetch a Variable Number of Records with SQL
June 15, 2005 Hey, Ted
If you want to use a variable for the number of rows to fetch in an SQL query, there is an alternative to the FETCH FIRST n ROWS technique you presented recently in Four Hundred Guru. Here is some code from an SQLRPGLE program shell I have used since V5R1. It uses a cursor instead of placing the number of rows directly into the SELECT statement.
c/Exec SQL c+ Fetch from C1 for :NbrRows rows into :RtnDtaSet c/End-Exec
–Rick
Rick’s comment is in response to the last paragraph of the issue he refers to. His idea is to use a multi-row fetch, which requires that a structure of some sort (depending on the language) be defined to receive the data. In RPG, the data is placed into a multiple-occurrence data structure.
Here’s another example that is a tad more complete. I have omitted the error-checking logic. The FETCH retrieves the number of rows specified by the first parameter.
Fqsysprt o f 132 printer D CustData ds occurs(12) D CustNumber 6 0 D CustName 12 D Rows s 3p 0 D Ndx s 3p 0 C *entry plist C parm Rows C/exec sql C+ declare Customers cursor for C+ select cusnum, lstnam || ' ' || init C+ from qiws/qcustcdt C/end-exec C/exec sql C+ open Customers C/end-exec C/exec sql C+ fetch Customers for :Rows Rows C+ into :CustData C/end-exec C for ndx = 1 to Rows C ndx occur CustData C except PLine C endfor C/exec sql C+ close Customers C/end-exec C eval *inlr = *on Oqsysprt e pline 1 O Ndx 4 O CustNumber + 1 O CustName + 1
After the FETCH retrieves the number of rows indicated by the ROWS variable, a simple loop lists the retrieved records.
–Ted
RELATED STORY
SQL Can Return One or a Few Records