次の方法で共有


FETCH ステートメント

適用対象:はい Databricks Runtime 18.1 以降とマークされているチェック

開いているカーソルから次の行を変数にフェッチします。

FETCH ステートメントは、カーソルの結果セットから一度に 1 行ずつ取得し、列の値を指定された変数に割り当てます。 これ以上行を使用できない場合は、 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

    列の値を受け取るローカル変数またはセッション変数。 変数の数は、1 つの例外を除き、カーソルの結果セット内の列数と一致する必要があります。それ以外 の場合は、ASSIGNMENT_ARITY_MISMATCH が発生します。

    • 変数が 1 つだけ指定されていて、それが STRUCT 型で、カーソルが複数の列を返す場合、列の値は位置によって構造体のフィールドに割り当てられます。

    列データ型は、ストアの割り当て規則に従って、ターゲット変数 (または構造体フィールド) と互換性がある必要があります。

注記

これ以上行を使用できない場合、 FETCHCURSOR_NO_MORE_ROWS 条件 (SQLSTATE '02000') を発生させます。 これは完了条件であり、例外ではありません。実行は中止されません。 NOT FOUNDハンドラーまたはCURSOR_NO_MORE_ROWS ハンドラーは、それを処理できます。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