다음을 통해 공유


FETCH 문

적용 대상: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 [, ...]

매개 변수

  • cursor_name

    열려 있는 커서의 이름입니다. 커서는 복합 문 레이블(예: outer_label.my_cursor)을 사용하여 선택적으로 정규화할 수 있습니다.

  • NEXT FROM

    선택적 키워드입니다. NEXTFROM 문 설탕이며 동작에 영향을 미치지 않습니다. 전달 페치만 지원됩니다.

  • variable_name

    열 값을 받을 로컬 또는 세션 변수입니다. 변수 수는 커서의 결과 집합에 있는 열 수와 일치해야 합니다. 단, 그렇지 않으면 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