Поделиться через


Оператор FETCH

Область применения:check помечена да 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

    Необязательные ключевые слова. NEXT и FROM являются синтаксическим сахаром и не влияют на поведение. Поддерживается только перенаправление.

  • variable_name

    Локальная или сеансовая переменная для получения значений столбцов. Число переменных должно соответствовать количеству столбцов в результирующем наборе курсора, за исключением одного исключения; в противном случае вызывается ASSIGNMENT_ARITY_MISMATCH :

    • Если указана ровно одна переменная и она является типом STRUCT , а курсор возвращает несколько столбцов, значения столбцов назначаются полям структуры по позиции.

    Типы данных столбцов должны быть совместимы с целевыми переменными (или полями структуры) в соответствии с правилами назначения хранилища.

Примечания.

При отсутствии дополнительных FETCH строк вызывает условие CURSOR_NO_MORE_ROWS (SQLSTATE '02000'). Это условие завершения, а не исключение: он не прерывает выполнение. CURSOR_NO_MORE_ROWS Обработчик NOT FOUND может обработать его; NOT FOUND перехватывает все условия SQLSTATE'02xxx'.

Извлечение из курсора, который не открыт, вызывает 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