Contents Index EXPLAIN statement [ESQL] FOR statement

ASA SQL Reference
  SQL Statements

FETCH statement [ESQL] [SP]


Description 

Use this statement to reposition a cursor and then get data from it.

Syntax 

FETCH cursor-position cursor-name
INTO { hostvar-list | variable-list }
   | USING DESCRIPTOR sqlda-name ]
PURGE ]
BLOCK n ]
FOR UPDATE ]
ARRAY fetch-count ]
INTO variable-list [ FOR UPDATE ]

cursor-position :
    NEXT | PRIOR | FIRST | LAST
| { ABSOLUTE | RELATIVE } row-count

row-count : number or hostvar

cursor-name :  identifier or hostvar

hostvar-list : may contain indicator variables

variable-list :   stored procedure variables

sqlda-name :   identifier

fetch-count :  integer or hostvar

Parameters 

INTO    The INTO clause is optional. If it is not specified, the FETCH statement positions the cursor only. The hostvar-list is for Embedded SQL use only.

cursor position    An optional positional parameter allows the cursor to be moved before a row is fetched. If the fetch includes a positioning parameter and the position is outside the allowable cursor positions, the SQLE_NOTFOUND warning is issued and the SQLCOUNT field indicates the offset from a valid position.

The OPEN statement initially positions the cursor before the first row.

Cursor positioning problems 
Inserts and some updates to DYNAMIC SCROLL cursors can cause problems with cursor positioning. The database server does not put inserted rows at a predictable position within a cursor unless there is an ORDER BY clause on the SELECT statement. In some cases, the inserted row does not appear at all until the cursor is closed and opened again.

This occurs if a temporary table had to be created to open the cursor (see Use of work tables in query processing for a description).

The UPDATE statement may cause a row to move in the cursor. This will happen if the cursor has an ORDER BY that uses an existing index (a temporary table is not created).

BLOCK clause    Rows may be fetched by the client application more than one at a time. This is referred to as block fetching, prefetching, or multi-row fetching. The first fetch causes several rows to be sent back from the server. The client buffers these rows, and subsequent fetches are retrieved from these buffers without a new request to the server.

The BLOCK clause is for use in Embedded SQL only. It gives the client and server a hint as to how many rows may be fetched by the application. The special value of 0 means the request will be sent to the server and a single row will be returned (no row blocking).

If no BLOCK clause is specified, the value specified on OPEN is used. For more information, see OPEN statement [ESQL] [SP].

FETCH RELATIVE 0 always re-fetches the row.

PURGE clause    The PURGE clause is for use in embedded SQL only. It causes the client to flush its buffers of all rows, and then send the fetch request to the server. Note that this fetch request may return a block of rows.

FOR UPDATE clause    The FOR UPDATE clause indicates that the fetched row will subsequently be updated with an UPDATE WHERE CURRENT OF CURSOR statement. This clause causes the database server to put a write lock on the row. The lock will be held until the end of the current transaction. See How locking works.

ARRAY clause    The ARRAY clause is for use in Embedded SQL only. It allows so-called wide fetches, which retrieve more than one row at a time, and which may improve performance.

To use wide fetches in embedded SQL, include the fetch statement in your code as follows:

EXEC SQL FETCH . . . ARRAY nnn

where ARRAY nnn is the last item of the FETCH statement. The fetch count nnn can be a host variable. The SQLDA must contain nnn * (columns per row) variables. The first row is placed in SQLDA variables 0 to (columns per row)-1, and so on.

For a detailed example of using wide fetches, see the section Fetching more than one row at a time.

Usage 

The FETCH statement retrieves one row from the named cursor. The cursor must have been previously opened.

Embedded SQL use    A DECLARE CURSOR statement must appear before the FETCH statement in the C source code, and the OPEN statement must be executed before the FETCH statement. If a host variable is being used for the cursor name, the DECLARE statement actually generates code and thus must be executed before the FETCH statement.

The server returns in SQLCOUNT the number of records fetched, and always returns a SQLCOUNT greater than zero unless there is an error or warning. A SQLCOUNT of zero with no error condition indicates that one valid row has been fetched.

If the SQLSTATE_NOTFOUND warning is returned on the fetch, the sqlerrd[2] field of the SQLCA (SQLCOUNT) contains the number of rows by which the attempted fetch exceeded the allowable cursor positions. The value is 0 if the row was not found but the position is valid; for example, executing FETCH RELATIVE 1 when positioned on the last row of a cursor. The value is positive if the attempted fetch was beyond the end of the cursor, and negative if the attempted fetch was before the beginning of the cursor.

After successful execution of the fetch statement, the sqlerrd[1] field of the SQLCA (SQLIOCOUNT) is incremented by the number of input/output operations required to perform the fetch. This field is actually incremented on every database statement.

Single row fetch    One row from the result of the SELECT statement is put into the variables in the variable list. The correspondence is one-to-one from the select list to the host variable list.

Multi-row fetch    One or more rows from the result of the SELECT statement are put into either the variables in variable-list or the program data areas described by sqlda-name. In either case, the correspondence is one-to-one from the select-list to either the hostvar-list or the sqlda-name descriptor array.

Permissions 

The cursor must be opened, and the user must have SELECT permission on the tables referenced in the declaration of the cursor.

Side effects 

None.

See also 

DECLARE CURSOR statement [ESQL] [SP]

PREPARE statement [ESQL]

OPEN statement [ESQL] [SP]

Using cursors in embedded SQL

Using cursors in procedures and triggers

FETCH in PowerScript Reference

Standards and compatibility 
Example 

The following is an Embedded SQL example.

EXEC SQL DECLARE cur_employee CURSOR FOR
SELECT emp_id, emp_lname FROM employee;
EXEC SQL OPEN cur_employee;
EXEC SQL FETCH cur_employee
INTO :emp_number, :emp_name:indicator;

The following is a procedure example:

BEGIN
   DECLARE cur_employee CURSOR FOR
      SELECT emp_lname
      FROM employee;
   DECLARE name CHAR(40);
   OPEN cur_employee;
   LOOP
      FETCH NEXT cur_employee into name;
       ...
   END LOOP
   CLOSE cur_employee;
END

Contents Index EXPLAIN statement [ESQL] FOR statement