====== ALLOCATE CURSOR Statement ======
ALLOCATE CURSOR statement allows you to declare a cursor and associate it with a result set returned from a stored procedure.
**Syntax**:
ALLOCATE cursor_name CURSOR FOR PROCEDURE procedure_name; -- Teradata compatibility
|
ALLOCATE cursor_name CURSOR FOR RESULT SET locator_name; -- DB2 compatibility
**Example 1:**
Sample stored procedure returning a single result set:
CREATE PROCEDURE spOpenIssues
DYNAMIC RESULT SETS 1
BEGIN
DECLARE cur CURSOR WITH RETURN FOR
SELECT id, name FROM issues;
OPEN cur;
END;
Call a stored procedure and process the returned result set (Teradata compatibility):
DECLARE id INT;
DECLARE name VARCHAR(30);
CALL spOpenIssues;
ALLOCATE c1 CURSOR FOR PROCEDURE spOpenIssues;
FETCH c1 INTO id, name;
WHILE (SQLCODE = 0)
DO
PRINT id || ' - ' || name;
FETCH c1 INTO id, name;
END WHILE;
CLOSE c1;
Call a stored procedure and process the returned result set (IBM DB2 compatibility):
DECLARE id INT;
DECLARE name VARCHAR(30);
DECLARE loc RESULT_SET_LOCATOR VARYING;
CALL spOpenIssues;
ASSOCIATE RESULT SET LOCATOR (loc) WITH PROCEDURE spOpenIssues;
ALLOCATE c1 CURSOR FOR RESULT SET loc;
FETCH c1 INTO id, name;
WHILE (SQLCODE = 0)
DO
PRINT id || ' - ' || name;
FETCH c1 INTO id, name;
END WHILE;
CLOSE c1;
**Example 2:**
Sample stored procedure returning multiple result sets:
CREATE PROCEDURE spOpenIssues2
DYNAMIC RESULT SETS 2
BEGIN
DECLARE cur CURSOR WITH RETURN FOR
SELECT id, name FROM issues;
DECLARE cur2 CURSOR WITH RETURN FOR
SELECT id, name FROM issues_hold;
OPEN cur;
OPEN cur2;
END;
Call a stored procedure and process 2 result sets (Teradata compatibility):
DECLARE id INT;
DECLARE name VARCHAR(30);
CALL spOpenIssues2;
-- First result set
ALLOCATE c1 CURSOR FOR PROCEDURE spOpenIssues2;
FETCH c1 INTO id, name;
WHILE (SQLCODE = 0)
DO
-- ...
FETCH c1 INTO id, name;
END WHILE;
CLOSE c1;
-- Second result set
ALLOCATE c2 CURSOR FOR PROCEDURE spOpenIssues2;
FETCH c2 INTO id, name;
WHILE (SQLCODE = 0)
DO
-- ...
FETCH c2 INTO id, name;
END WHILE;
CLOSE c2;
Call a stored procedure and process 2 result sets (IBM DB2 compatibility):
DECLARE id INT;
DECLARE name VARCHAR(30);
DECLARE loc1 RESULT_SET_LOCATOR VARYING;
DECLARE loc2 RESULT_SET_LOCATOR VARYING;
CALL spOpenIssues2;
ASSOCIATE RESULT SET LOCATOR (loc1, loc2) WITH PROCEDURE spOpenIssues2;
-- First result set
ALLOCATE c1 CURSOR FOR RESULT SET loc1;
FETCH c1 INTO id, name;
WHILE (SQLCODE = 0)
DO
-- ...
FETCH c1 INTO id, name;
END WHILE;
CLOSE c1;
-- Second result set
ALLOCATE c2 CURSOR FOR RESULT SET loc2;
FETCH c2 INTO id, name;
WHILE (SQLCODE = 0)
DO
-- ...
FETCH c2 INTO id, name;
END WHILE;
CLOSE c2;
**Compatibility:** IBM DB2 and Teradata
**Version:** HPL/SQL 0.3.11
**See also:**
* [[open|OPEN]]
* [[fetch|FETCH]]
* [[close|CLOSE]]
* [[sqlcode|SQLCODE]]