적용 대상:yes Databricks Runtime 18.1 이상으로 ![]()
열려 있는 커서에서 다음 행을 변수로 가져옵니다.
이 문은 FETCH 커서의 결과 집합에서 한 번에 한 행을 검색하고 지정된 변수에 열 값을 할당합니다. 사용할 수 있는 행이 더 이상 없으면 CURSOR_NO_MORE_ROWS 조건이 발생합니다(SQLSTATE '02000').
이 문장은 복합 문장안에서만 사용할 수 있습니다.
비고
예를 FETCH들어 변수에 열 값을 할당할 때 캐스팅 오류(예: DATATYPE_MISMATCH)가 발생할 수 있습니다.
DIVIDE_BY_ZERO 같은 런타임 오류도 발생할 수 있으며 SQL 처리의 집합 지향 특성으로 인해 가져오는 행과 관련이 없을 수 있습니다.
문법
FETCH [ [ NEXT ] FROM ] cursor_name INTO variable_name [, ...]
매개 변수
-
열려 있는 커서의 이름입니다. 커서는 복합 문 레이블(예:
outer_label.my_cursor)을 사용하여 선택적으로 정규화할 수 있습니다. NEXT FROM선택적 키워드입니다.
NEXT구FROM문 설탕이며 동작에 영향을 미치지 않습니다. 전달 페치만 지원됩니다.-
열 값을 받을 로컬 또는 세션 변수입니다. 변수 수는 커서의 결과 집합에 있는 열 수와 일치해야 합니다. 단, 그렇지 않으면 ASSIGNMENT_ARITY_MISMATCH 발생합니다.
- 정확히 하나의 변수가 지정되고 형식이고 커서가
STRUCT여러 열을 반환하는 경우 열 값은 위치별로 구조체의 필드에 할당됩니다.
열 데이터 형식은 저장소 할당 규칙에 따라 대상 변수(또는 구조체 필드)와 호환되어야 합니다.
- 정확히 하나의 변수가 지정되고 형식이고 커서가
비고
더 이상 행을 사용할 수 FETCH 없으면 CURSOR_NO_MORE_ROWS 조건(SQLSTATE '02000')을 발생합니다. 이는 예외가 아니라 완료 조건입니다. 실행을 중단하지 않습니다. A NOT FOUND 또는 CURSOR_NO_MORE_ROWS 처리기는 이를 처리할 NOT FOUND 수 있으며 모든 SQLSTATE '02xxx' 조건을 catch합니다.
열려 있지 않은 커서에서 페치하면 CURSOR_NOT_OPEN 발생합니다. 형식 호환성은 저장소 할당 규칙을 따릅니다. 호환되지 않는 형식은 DATATYPE_MISMATCH 오류를 발생합니다. 암시적 캐스트는 가능하면 적용됩니다.
변수는 복합 문 에 선언된 지역 변수이거나 세션 수준에서 만든 DECLARE VARIABLE 세션 변수일 수 있습니다.
예시
-- Basic fetch into variables
> BEGIN
DECLARE x INT;
DECLARE y STRING;
DECLARE my_cursor CURSOR FOR
SELECT id, 'row_' || id FROM range(3);
OPEN my_cursor;
FETCH my_cursor INTO x, y;
VALUES (x, y);
CLOSE my_cursor;
END;
0|row_0
-- Fetch multiple rows with REPEAT loop
> BEGIN
DECLARE x INT;
DECLARE done BOOLEAN DEFAULT false;
DECLARE total INT DEFAULT 0;
DECLARE sum_cursor CURSOR FOR SELECT id FROM range(5);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
OPEN sum_cursor;
REPEAT
FETCH sum_cursor INTO x;
IF NOT done THEN
SET total = total + x;
END IF;
UNTIL done END REPEAT;
CLOSE sum_cursor;
VALUES (total);
END;
10
-- Fetch into a struct variable
> BEGIN
DECLARE result STRUCT<id: INT, name: STRING>;
DECLARE struct_cursor CURSOR FOR
SELECT id, 'name_' || id FROM range(3);
OPEN struct_cursor;
FETCH struct_cursor INTO result;
VALUES (result.id, result.name);
CLOSE struct_cursor;
END;
0|name_0
-- Using NEXT FROM (optional syntax)
> BEGIN
DECLARE x INT;
DECLARE cursor1 CURSOR FOR SELECT id FROM range(3);
OPEN cursor1;
FETCH NEXT FROM cursor1 INTO x;
VALUES (x);
CLOSE cursor1;
END;
0