Sdílet prostřednictvím


Příkaz FETCH

Platí pro:check označený ano Databricks Runtime 18.1 a novější

Načte další řádek z otevřeného kurzoru do proměnných.

Příkaz FETCH načte vždy jeden řádek ze sady výsledků kurzoru a přiřadí hodnoty sloupců zadaným proměnným. Pokud nejsou k dispozici žádné další řádky, je vyvolána podmínka CURSOR_NO_MORE_ROWS (SQLSTATE '02000').

Tento příkaz lze použít pouze ve složeném příkazu .

Poznámka:

Chyby FETCHpřetypování (například DATATYPE_MISMATCH) mohou být vyvolány při přiřazování hodnot sloupců proměnným. K chybám za běhu, jako je DIVIDE_BY_ZERO , může také dojít a nemusí souviset s načteným řádkem kvůli sadě orientované povaze zpracování SQL.

Syntaxe

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

Parametry

  • cursor_name

    Název otevřeného kurzoru. Kurzor může být volitelně kvalifikovaný pomocí popisku složeného příkazu (např outer_label.my_cursor. ).

  • NEXT FROM

    Volitelná klíčová slova NEXT a FROM jsou syntaktický cukr a neovlivňují chování. Podporuje se pouze přesměrování načítání.

  • variable_name

    Místní proměnná nebo proměnná relace pro příjem hodnot sloupců. Počet proměnných musí odpovídat počtu sloupců v sadě výsledků kurzoru s jednou výjimkou; jinak ASSIGNMENT_ARITY_MISMATCH je vyvolána:

    • Pokud je zadána přesně jedna proměnná a jedná se o STRUCT typ a kurzor vrátí více sloupců, hodnoty sloupců se přiřadí k polím struktury podle pozice.

    Datové typy sloupců musí být kompatibilní s cílovými proměnnými (nebo poli struktury) podle pravidel přiřazení úložiště.

Poznámky

Pokud nejsou k dispozici žádné další řádky, FETCH vyvolá CURSOR_NO_MORE_ROWS podmínku (SQLSTATE '02000'). Jedná se o podmínku dokončení, ne o výjimku: neukončí provádění. Obslužná rutina NOT FOUND ji CURSOR_NO_MORE_ROWS může zpracovat, NOT FOUND zachytí všechny podmínky SQLSTATE '02xxx' .

Načítání z kurzoru, který není otevřený , vyvolá CURSOR_NOT_OPEN. Kompatibilita typů se řídí pravidly přiřazení úložiště: nekompatibilní typy vyvolávají chybu DATATYPE_MISMATCH ; implicitní přetypování se použijí, pokud je to možné.

Proměnné můžou být místní proměnné deklarované ve složených příkazech nebo proměnných relací vytvořených na DECLARE VARIABLE úrovni relace.

Příklady

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