Compartilhar via


Instrução FETCH

Aplica-se a:check marked yes Databricks Runtime 18.1 e superior

Busca a próxima linha de um cursor aberto em 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 CURSOR_NO_MORE_ROWS será gerada (SQLSTATE '02000').

Essa instrução só pode ser usada em uma instrução composta.

Observação

Para FETCH, erros de conversão (por exemplo, DATATYPE_MISMATCH) podem ser gerados ao atribuir valores de coluna a variáveis. Erros de runtime, como DIVIDE_BY_ZERO , também podem ocorrer e não podem estar relacionados à linha que está sendo buscada devido à natureza orientada ao conjunto do processamento do 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 um rótulo de instrução composta (por exemplo, outer_label.my_cursor).

  • NEXT FROM

    Palavras-chave opcionais. NEXT e FROM são açúcar sintactico e não afetam o comportamento. Há suporte apenas para a busca de encaminhamento.

  • 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 será gerado:

    • Se exatamente uma variável for especificada e for um STRUCT tipo e o cursor retornar várias colunas, os valores de coluna serão atribuídos aos campos do struct 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 do repositório.

Anotações

Quando não há mais linhas disponíveis, FETCH gera a condição de CURSOR_NO_MORE_ROWS (SQLSTATE '02000'). Essa é uma condição de conclusão, não uma exceção: ela não anula a execução. Um NOT FOUND ou CURSOR_NO_MORE_ROWS manipulador pode processá-lo; NOT FOUND captura todas as condições do SQLSTATE '02xxx' .

Buscar de um cursor que não está aberto gera CURSOR_NOT_OPEN. A compatibilidade de tipos segue as regras de atribuição do repositório: tipos incompatíveis geram um erro de DATATYPE_MISMATCH ; as conversões implícitas são aplicadas quando possível.

As variáveis podem ser variáveis locais declaradas na instrução composta ou variáveis de sessão criadas no DECLARE VARIABLE 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