BEGIN END 复合语句

适用于:打勾标记 Databricks Runtime 16.3 及更高版本

重要

此功能目前以公共预览版提供。

实现一个 SQL 脚本块,该块可以包含一系列 SQL 语句、流控制语句、局部变量声明和异常处理程序。

注释

从笔记本调用复合语句时,它必须是单元格中唯一的语句。

语法

[ label : ]
      BEGIN
      [ { declare_variable | declare_condition } ; [...] ]
      [ declare_handler ; [...] ]
      [ SQL_statement ; [...] ]
      END [ label ]

declare_variable
  DECLARE variable_name datatype [ DEFAULT default_expr ]

declare_condition
  DECLARE condition_name CONDITION [ FOR SQLSTATE [ VALUE ] sqlstate ]

declare_handler
  DECLARE handler_type HANDLER FOR condition_values handler_action

handler_type
  EXIT

condition_values
 { { SQLSTATE [ VALUE ] sqlstate | condition_name } [, ...] |
   { SQLEXCEPTION | NOT FOUND } [, ...] }

参数

  • 标签

    可选标识符用于限定在复合语句中定义的变量和退出复合语句。 这两个标签的出现必须一致,并且只有在 END 标签已被指定的情况下,才能指定 label: 标签。

    不能为顶级复合语句指定标签

  • NOT ATOMIC

    指定,如果复合中的 SQL 语句失败,则不会回滚以前的 SQL 语句。 这是默认行为和唯一行为。

  • declare_variable

    一个或多个变量的局部变量声明

    • variable_name

      变量的名称。 名称不得限定,且在复合语句中是唯一的。

    • data_type

      支持的任何数据类型。 如果省略data_type,则必须指定default,并且类型派生自default_expression。

    • { DEFAULT | = } default_expression

      定义变量在声明后的初始值。 default_expression 必须可以强制转换为 data_type。 如果未指定默认值,则会使用 NULL 初始化变量。

  • Declare_condition

    本地条件声明

    • condition_name

      条件的非限定名称的范围只限在复合语句之内。

    • sqlstate

      一个 STRING 文本,包含由 A-Z 和 0..9 构成的 5 个字母数字字符(不区分大小写)。 SQLSTATE 不得以“00”、“01”或“XX”开头。 从“02”开始的任何 SQLSTATE 也会被预定义的 NOT FOUND 异常捕获。 如果未指定,则 SQLSTATE 为“45000”。

  • declare_handler

    错误处理函数的声明。

    • handler_type

      • EXIT

        处理条件后,分类处理程序以退出复合语句。

    • condition_values

      指定处理程序适用的 SQL状态码或条件。 条件值在复合语句中的所有处理程序中必须是唯一的。 特定条件值优先于 SQLEXCEPTION.

    • sqlstate

      一个 STRING 文本,包含由 'A'-'Z''0'-'9' 构成的 5 个字符(不区分大小写)。

    • condition_name

      在此复合中定义的条件、外部复合语句或系统定义的错误类。

    • SQLEXCEPTION

      适用于任何面向用户的错误情况。

    • NOT FOUND

      适用于 SQLSTATE“02”类的任何错误条件。

    • handler_action

      在发生任何条件值时要执行的 SQL 语句。 若要添加多个语句,请使用嵌套复合语句。

  • SQL_statement

    SQL 语句,如 DDL、DML、控制语句或复合语句。 任何 SELECTVALUES 语句都会生成调用程序可以使用的结果集。

例子

-- A compound statement with local variables, and exit hanlder and a nested compound.
> BEGIN
    DECLARE a INT DEFAULT 1;
    DECLARE b INT DEFAULT 5;
    DECLARE EXIT HANDLER FOR DIVIDE_BY_ZERO
      div0: BEGIN
        VALUES (15);
      END div0;
    SET a = 10;
    SET a = b / 0;
    VALUES (a);
END;
15