HPL/SQL - ALLOCATE CURSOR 문

HPL/SQL - ALLOCATE CURSOR 문

ALLOCATE CURSOR 문은 커서를 선언하고, 저장 프로시저가 반환한 결과 집합(result set)에 그 커서를 연결하는 데 사용해요. 저장 프로시저를 호출하고 나온 결과를 프로그래밍적으로 순회할 때 아주 유용합니다.

출처: 문서

본문

ALLOCATE CURSOR 문은 커서를 선언하고 이를 저장 프로시저가 반환한 결과 집합에 연결합니다.

구문(Syntax):

ALLOCATE cursor_name CURSOR FOR PROCEDURE procedure_name;  -- Teradata 호환
|
ALLOCATE cursor_name CURSOR FOR RESULT SET locator_name;   -- DB2 호환

예제 1:

하나의 결과 집합을 반환하는 저장 프로시저 예시:

CREATE PROCEDURE spOpenIssues
  DYNAMIC RESULT SETS 1
BEGIN
  DECLARE cur CURSOR WITH RETURN FOR
    SELECT id, name FROM issues;
  OPEN cur;
END;

저장 프로시저를 호출하고 반환된 결과 집합을 처리합니다(Teradata 호환):

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;

저장 프로시저를 호출하고 반환된 결과 집합을 처리합니다(IBM DB2 호환):

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;

예제 2:

여러 개의 결과 집합을 반환하는 저장 프로시저 예시:

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;

저장 프로시저를 호출하고 2개의 결과 집합을 처리합니다(Teradata 호환):

DECLARE id INT;
DECLARE name VARCHAR(30);

CALL spOpenIssues2;

-- 첫 번째 결과 집합
ALLOCATE c1 CURSOR FOR PROCEDURE spOpenIssues2;
FETCH c1 INTO id, name;
WHILE (SQLCODE = 0)
DO
  -- ...
  FETCH c1 INTO id, name;
END WHILE;
CLOSE c1;

-- 두 번째 결과 집합
ALLOCATE c2 CURSOR FOR PROCEDURE spOpenIssues2;
FETCH c2 INTO id, name;
WHILE (SQLCODE = 0)
DO
  -- ...
  FETCH c2 INTO id, name;
END WHILE;
CLOSE c2;

저장 프로시저를 호출하고 2개의 결과 집합을 처리합니다(IBM DB2 호환):

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;

-- 첫 번째 결과 집합
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;

-- 두 번째 결과 집합
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 및 Teradata

참고(See also):

  • OPEN
  • FETCH
  • CLOSE
  • SQLCODE

더 알아보기 (Learn more)

ALLOCATE CURSOR 문은 저장 프로시저 결과를 커서로 다루기 위한 기능이에요. 커서를 여는 OPEN, 행을 읽는 FETCH, 닫는 CLOSE 문과 함께 사용하세요. Teradata뿐 아니라 DB2의 RESULT_SET_LOCATOR 방식도 지원합니다.