ATOMIC 子句
原子语句是完全执行或根本不执行的语句。例如,更新数千行的 UPDATE 语句在更新许多行后可能会遇到错误。如果该语句没有完成,则所有更改都恢复为其原始状态。同样,如果指定 BEGIN 语句为原子语句,则此语句要么完全执行,要么根本不执行。
local-declaration
紧接在 BEGIN 后,复合语句可以具有适用于仅在复合语句内使用的对象的本地声明。复合语句可以有变量、游标、临时表或异常的本地声明。局部声明可由该复合语句中的任何语句引用,或者可由该复合语句内嵌套的任何复合语句中的任何语句引用。复合语句的局部声明对语句的异常处理程序可见。本地声明对于从复合语句中调用的其它过程不可见。
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;
下面的示例声明了以下变量:
v1 为 INT 型,初始设置为 5。
v2 和 v3 为 CHAR(10) 型,初始值均为 abc。
BEGIN
DECLARE v1 INT = 5
DECLARE v2, v3 CHAR(10) = 'abc'
// ...
END