适用于:
Databricks Runtime 18.1 及更高版本
将下一行从打开的游标提取到变量中。
该 FETCH 语句从游标的结果集中一次检索一行,并将列值分配给指定的变量。 如果没有更多行可用,则会引发 CURSOR_NO_MORE_ROWS 条件(SQLSTATE '02000')。
此语句只能在 复合语句中使用。
注释
对于 FETCH,向变量分配列值时,可以引发强制转换错误(例如 ,DATATYPE_MISMATCH)。 运行时错误(如 DIVIDE_BY_ZERO )也可能发生,并且由于 SQL 处理面向集的性质,可能与提取的行无关。
Syntax
FETCH [ [ NEXT ] FROM ] cursor_name INTO variable_name [, ...]
参数
-
打开的游标的名称。 可以使用复合语句标签(例如,
outer_label.my_cursor)选择性地限定游标。 NEXT FROM可选关键字。
NEXT是FROM语法糖,不影响行为。 仅支持转发提取。-
用于接收列值的本地或会话变量。 变量数必须与游标结果集中的列数匹配,但有一个例外:否则,将引发 ASSIGNMENT_ARITY_MISMATCH :
- 如果指定了一个变量并且它是一种
STRUCT类型,并且游标返回多个列,则按位置将列值分配给结构字段。
根据存储分配规则,列数据类型必须与目标变量(或结构字段)兼容。
- 如果指定了一个变量并且它是一种
注释
如果没有更多行可用, FETCH 请引发 CURSOR_NO_MORE_ROWS 条件(SQLSTATE '02000')。 这是一个完成条件,而不是异常:它不会中止执行。
CURSOR_NO_MORE_ROWS或NOT FOUND处理程序可以处理它;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