Partilhar via


Instrução FETCH

Aplica-se a:sim Databricks Runtime 18.1 e superiores

Obtém a próxima linha de um cursor aberto para variáveis.

A FETCH instrução recupera uma linha de cada vez do conjunto de resultados do cursor e atribui valores de coluna às variáveis especificadas. Se não houver mais linhas disponíveis, a condição de CURSOR_NO_MORE_ROWS é elevada (SQLSTATE '02000').

Esta declaração só pode ser usada dentro de uma declaração composta .

Observação

Para FETCH, erros de lançamento (por exemplo, DATATYPE_MISMATCH) podem ser levantados ao atribuir valores de coluna a variáveis. Erros de execução como DIVIDE_BY_ZERO também podem ocorrer e podem não estar relacionados com a linha a ser obtida, devido à natureza orientada a conjuntos do processamento SQL.

Sintaxe

FETCH [ [ NEXT ] FROM ] cursor_name INTO variable_name [, ...]

Parâmetros

  • cursor_name

    O nome de um cursor aberto. O cursor pode ser opcionalmente qualificado com uma etiqueta de instrução composta (por exemplo, outer_label.my_cursor).

  • NEXT FROM

    Palavras-chave opcionais. NEXT e FROM são açúcar sintático e não afetam o comportamento. Só é suportado o forward fetching.

  • variable_name

    Uma variável local ou de sessão para receber valores de coluna. O número de variáveis deve corresponder ao número de colunas no conjunto de resultados do cursor, com uma exceção; caso contrário , ASSIGNMENT_ARITY_MISMATCH é elevado:

    • Se exatamente uma variável for especificada e for um STRUCT tipo, e o cursor devolver várias colunas, os valores das colunas são atribuídos aos campos da estrutura por posição.

    Os tipos de dados de coluna devem ser compatíveis com as variáveis de destino (ou campos de struct) de acordo com as regras de atribuição de armazenamento.

Observações

Quando não há mais linhas disponíveis, FETCH eleva-se a condição de CURSOR_NO_MORE_ROWS (SQLSTATE '02000'). Esta é uma condição de completão, não uma exceção: não aborta a execução. Um NOT FOUND handler ou CURSOR_NO_MORE_ROWS pode processá-lo; NOT FOUND capta todas as condições SQLSTATE '02xxx' .

Buscar a partir de um cursor que não está aberto aumenta CURSOR_NOT_OPEN. A compatibilidade de tipos segue as regras de atribuição de armazenamento: tipos incompatíveis geram um erro de DATATYPE_MISMATCH ; Os fundidos implícitos são aplicados sempre que possível.

As variáveis podem ser variáveis locais declaradas na instrução composta ou variáveis de sessão criadas com DECLARE VARIABLE ao nível da sessão.

Exemplos

-- 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