Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (A-D)

 

BEGIN 语句

此语句用于将 SQL 语句组合在一起。

语法
[ statement-label : ]
BEGIN [ [ NOT ] ATOMIC ]
   [ local-declaration; ... ]
   statement-list
   [ EXCEPTION [ exception-case ... ] ]
END [ statement-label ]
local-declaration :
 variable-declaration
| cursor-declaration
| exception-declaration
| temporary-table-declaration
variable-declaration :
DECLARE variable-name data-type
exception-declaration :
DECLARE exception-name EXCEPTION
FOR SQLSTATE [ VALUE ] string
exception-case :
 WHEN exception-name [, ... ] THEN statement-list
| WHEN OTHERS THEN statement-list
参数
  • local-declaration   紧接在 BEGIN 后,复合语句可以具有适用于仅在复合语句内使用的对象的本地声明。复合语句可以有变量、游标、临时表或异常的本地声明。局部声明可由该复合语句中的任何语句引用,或者可由该复合语句内嵌套的任何复合语句中的任何语句引用。本地声明对于从复合语句中调用的其它过程不可见。

  • statement-label   如果指定结尾 statement-label,则它必须与起始 statement-label 匹配。LEAVE 语句可用于在复合语句后的第一个语句处继续执行。复合语句是过程或触发器的主体,它具有与过程或触发器同名的隐式标签。

    有关复合语句和异常处理的完整说明,请参见过程和触发器中的错误和警告

  • ATOMIC 子句   原子语句是完全执行或根本不执行的语句。例如,更新数千行的 UPDATE 语句在更新许多行后可能会遇到错误。如果该语句没有完成,则所有更改都恢复为其原始状态。同样,如果指定 BEGIN 语句为原子语句,则此语句要么完全执行,要么根本不执行。

注释

过程或触发器的主体是复合语句。复合语句也可以用于过程或触发器内的控制语句。

复合语句允许一个或多个 SQL 语句组合在一起,按一个单元处理。复合语句以关键字 BEGIN 开始,以关键字 END 结束。

权限

无。

副作用

无。

另请参见
标准和兼容性
  • SQL/2003   持久存储模块特性。

示例

过程或触发器的主体是复合语句。

CREATE PROCEDURE TopCustomer (OUT TopCompany CHAR(35), OUT TopValue INT)
BEGIN
   DECLARE err_notfound EXCEPTION FOR
      SQLSTATE '02000';
   DECLARE curThisCust CURSOR FOR
      SELECT CompanyName, CAST(
            sum( SalesOrderItems.Quantity *
            Products.UnitPrice ) AS INTEGER) VALUE
      FROM Customers
            LEFT OUTER JOIN SalesOrders
            LEFT OUTER JOIN SalesOrderItems
            LEFT OUTER JOIN Products
      GROUP BY CompanyName;
   DECLARE ThisValue INT;
   DECLARE ThisCompany CHAR( 35 );
   SET TopValue = 0;
   OPEN curThisCust;
   CustomerLoop:
   LOOP
      FETCH NEXT curThisCust
         INTO ThisCompany, ThisValue;
      IF SQLSTATE = err_notfound THEN
         LEAVE CustomerLoop;
      END IF;
      IF ThisValue > TopValue THEN
         SET TopValue = ThisValue;
         SET TopCompany = ThisCompany;
      END IF;
   END LOOP CustomerLoop;
   CLOSE curThisCust;
END;