A loop over a query repeats for every record in the query record set. The cfloop results are just like a cfoutput. During each iteration of the loop, the columns of the current row are available for output. The cfloop tag lets you loop over tags that can not be used inside cfoutput.
<cfloop query = "query_name" startRow = "row_num" endRow = "row_num">
cfabort, cfbreak, cfexecute, cfexit, cfif cfelseif cfelse, cflocation, cfswitch cfcase cfdefaultcase, cfthrow, cftry cfcatch
The following example shows a cfloop looping over a query that works in the same way as a cfoutput tag that uses the query attribute:
<cfquery name = "MessageRecords"
dataSource = "cfsnippets"> SELECT * FROM Messages </cfquery> <cfloop query = "MessageRecords"> <cfoutput>#Message_ID#</cfoutput><BR> </cfloop>
The cfloop tag also provides iteration over a recordset with dynamic start and stop points. This mechanism provides a simple means to get the next n sets of records from a query.
The following example loops from the tenth through the twentieth record returned by "MyQuery ":
<cfset Start = 10>
<cfset End = 20> <cfloop query = "MyQuery" startRow = "#Start#" endRow = "#End#"> <cfoutput>#MyQuery.MyColName#</cfoutput><BR> </cfloop>
The loop stops when there are no more records or when the current record index is greater than the value of the endRow attribute.
The advantage of looping over a query is that you can use CFML tags that are not allowed in a cfoutput. The following example combines the pages that are returned by a query of a list of page names into one document, using the cfinclude tag.
<cfquery name = "GetTemplate"
dataSource = "Library" maxRows = "5"> SELECT TemplateName FROM Templates </cfquery> <cfloop query = "TemplateName"> <cfinclude template = "#TemplateName#"> </cfloop>