Partager via


Instruction FETCH

S’applique à :check marqué oui Databricks Runtime 18.1 et versions ultérieures

Récupère la ligne suivante à partir d’un curseur ouvert dans des variables.

L’instruction FETCH récupère une ligne à la fois à partir du jeu de résultats du curseur et affecte des valeurs de colonne aux variables spécifiées. Si aucune ligne supplémentaire n’est disponible, la condition CURSOR_NO_MORE_ROWS est levée (SQLSTATE '02000').

Cette instruction peut uniquement être utilisée dans une instruction composée.

Note

Pour FETCHles erreurs de conversion (par exemple, DATATYPE_MISMATCH) peuvent être déclenchées lors de l’affectation de valeurs de colonne à des variables. Des erreurs d’exécution telles que DIVIDE_BY_ZERO peuvent également se produire et ne peuvent pas être liées à la ligne extraite, en raison de la nature définie du traitement SQL.

Syntaxe

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

Paramètres

  • cursor_name

    Nom d’un curseur ouvert. Le curseur peut éventuellement être qualifié avec une étiquette d’instruction composée (par exemple outer_label.my_cursor).

  • NEXT FROM

    Mots clés facultatifs. NEXT et FROM sont le sucre syntactique et n’affectent pas le comportement. Seule la récupération vers l’avant est prise en charge.

  • variable_name

    Variable locale ou de session pour recevoir des valeurs de colonne. Le nombre de variables doit correspondre au nombre de colonnes dans le jeu de résultats du curseur, à une exception près ; sinon , ASSIGNMENT_ARITY_MISMATCH est levée :

    • Si exactement une variable est spécifiée et qu’il s’agit d’un STRUCT type et que le curseur retourne plusieurs colonnes, les valeurs de colonne sont affectées aux champs du struct par position.

    Les types de données de colonne doivent être compatibles avec les variables cibles (ou champs de struct) en fonction des règles d’affectation de magasin.

Remarques

Quand aucune ligne supplémentaire n’est disponible, FETCH déclenche la condition de CURSOR_NO_MORE_ROWS (SQLSTATE '02000'). Il s’agit d’une condition d’achèvement, et non d’une exception : elle n’abandonne pas l’exécution. Un NOT FOUND ou CURSOR_NO_MORE_ROWS un gestionnaire peut le traiter ; NOT FOUND intercepte toutes les conditions SQLSTATE '02xxx' .

L’extraction à partir d’un curseur qui n’est pas ouvert déclenche CURSOR_NOT_OPEN. La compatibilité des types suit les règles d’affectation de magasin : les types incompatibles déclenchent une erreur de DATATYPE_MISMATCH  ; les casts implicites sont appliqués lorsque cela est possible.

Les variables peuvent être des variables locales déclarées dans l’instruction composée ou les variables de session créées au DECLARE VARIABLE niveau de la session.

Exemples

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