ABAP Keyword Documentation → ABAP − Reference → Processing External Data → ABAP Database Access → ABAP SQL → ABAP SQL - Reads
OPEN CURSOR
Other versions: 7.31 | 7.40 | 7.54
Syntax
OPEN CURSOR [WITH HOLD] @dbcur|@DATA(dbcur) FOR
[WITH
+cte1 AS ( SELECT
subquery_clauses )[,
+cte2 AS ( SELECT subquery_clauses )
...]]
SELECT mainquery_clauses
[UNION ...]
[UP TO ...] [OFFSET ...]
[abap_options].
Addition
Effect
The ABAP SQL statement OPEN CURSOR
opens a
database cursor for the result set of the
main query defined after
FOR
and links a cursor variable dbcur
with this
database cursor. The results set of the main query can be read with the statement FETCH
.
The main query is specified after FOR
as follows:
-
The main query is specified using language element
SELECT
, and its clauses and additionsmainquery_clauses
define the result set. -
The language element
UNION
can be used to combine the result sets of multiple queries. In this case, special rulesquery_clauses
apply for specifying clauses. -
Finally, the optional additions UP
TO,
OFFSET
, andabap_options
can be specified. -
Optional common
table expressions can be defined in the main query by using the language element
WITH
. When defining and using common table expressions, the same applies as when usingWITH
to introduce a standalone statement.
The following can be specified for the cursor:
-
A host variable
dbcur
declared with the special predefined data typecursor
. A database cursordbcur
that has already been opened cannot be opened again. -
An inline declaration of a corresponding
host variable
dbcur
. The declaration operatorDATA
must be prefixed with the escape character@
.
A line of the result set is always assigned to an opened database cursor as a cursor position. After
the statement OPEN CURSOR
, the database cursor is positioned in front of the first line of the results set.
In a single program, a maximum of 17 database cursors can be open simultaneously across the
ABAP SQL interface.
If more than 17 database cursors are opened, the runtime error DBSQL_TOO_MANY_OPEN_CURSOR occurs. An
open database cursor can be closed using the statement CLOSE CURSOR
. Here, any open database cursors are closed by
database commits or
database rollbacks,
if these occur after the first use of the cursor in a FETCH
statement.
If a cursor variable dbcur
of an open database cursor is assigned to another
cursor variable or passed as a parameter, the latter is associated with the same database cursor at the same position. A cursor variable of an open database cursor can also be passed to
procedures that have been called externally, to enable the database cursor to be accessed from there.
Notes
-
It is not recommended that cursor variables are assigned to each other and they should be set only using the statements
OPEN CURSOR
andCLOSE CURSOR
. - If write accesses are made on a database table for which a database cursor is open, the results set is database-specific and undefined. Avoid this kind of parallel access if possible.
-
As well as explicit ABAP SQL reads using
OPEN CURSOR
andSELECT
loops, the ABAP SQL interface also opens database cursors implicitly, such as when loading buffered tables. The runtime error DBSQL_TOO_MANY_OPEN_CURSOR can be avoided by not using explicit reads to exploit the maximum number of open database cursors. -
If a CDS view is defined as a
replacement object for a database table or database view specified as a
data source of the
SELECT
statement ofOPEN CURSOR
, the statementFETCH
accesses the CDS view and not the database table or the database view. -
Host variables without the escape character
@
are obsolete. The escape character@
must be specified in the strict modes of the syntax check from Release 7.40, SP05. The use of an inline declaration fordbcur
activates the strict mode with release 7.51 and higher. If a statementOPEN CURSOR
is checked in accordance with the rules for the strict mode from Release 7.50, each statementFETCH
that accesses the database cursor is also checked in strict mode. Conversely, the strict syntax check mode from Release 7.54 also applies the strict mode for the associated statementOPEN CURSOR
in the statementFETCH
. If the rules specified byFETCH
inOPEN CURSOR
are broken, an exception of the class CX_SY_DYNAMIC_OSQL_SEMANTICS is raised.
Example
Opens two cursors for the database table SPFLI. For more information on how to use this function, see the example for FETCH
.
OPEN CURSOR @DATA(dbcur1) FOR
SELECT carrid, COUNT(*) AS count
FROM spfli
GROUP BY carrid
ORDER BY carrid.
OPEN CURSOR @DATA(dbcur2) FOR
SELECT *
FROM spfli
ORDER BY carrid.
Addition
... WITH HOLD
Effect
If the addition WITH HOLD
is specified, the database cursor is not closed by a
database commit executed using Native SQL.
The addition WITH HOLD
can be used only in reads performed on the standard
database. It cannot be specified together with the addition CONNECTION
.
Notes
-
A Native SQL database commit closes the database cursor only after the cursor is used in a
FETCH
statement. A Native SQL database commit between the statement OPEN CURSOR and the firstFETCH
statement does not close the cursor. -
The addition
WITH HOLD
is ignored by the following:
- Implicit database commits
- Commits made by the statement
COMMIT WORK
- Any rollbacks
-
A Native SQL database commit can be made explicitly using the statement
COMMIT CONNECTION
.
Example
The addition WITH HOLD
stops the database cursor from being closed using
an explicit database commit and the statement
COMMIT CONNECTION and hence stops an exception from being raised in the second
FETCH
statement. An exception is, however, raised after the statement COMMIT WORK
.
DATA wa TYPE scarr.
OPEN CURSOR WITH HOLD @DATA(dbcur) FOR
SELECT *
FROM scarr.
FETCH NEXT CURSOR @dbcur INTO @wa.
COMMIT CONNECTION default.
FETCH NEXT CURSOR @dbcur INTO @wa.
CLOSE CURSOR @dbcur.
TRY.
OPEN CURSOR WITH HOLD @dbcur FOR
SELECT *
FROM scarr.
COMMIT WORK.
FETCH NEXT CURSOR @dbcur INTO @wa.
CLOSE CURSOR @dbcur.
CATCH cx_sy_open_sql_db.
...
ENDTRY.