DECLARE语句用来定义各种程序的局部项:局部变量(参看存储过程中的变量),条件和处理器(参看条件和处理器)以及游标(参看游标)。目前不支持SIGNAL和RESIGNAL语句。
DECLARE只能被用在BEGIN...END复合语句之间,且必须位于其它语句之前。
游标必须在声明处理器变量之前被声明,并且条件必须在声明游标或处理器前声明。
语法格式:
DECLARE var_name[,...] type [DEFAULT value]
这个语句用来声明局部变量。如果要对变量提供一个默认的值,则包括一个DEFAULT语句。这个值可以指定为一个表达式,或一个常量。如果DEFAULT缺少子句,初始值为NULL。
局部变量的作用范围在它被声明的BEGIN...END块之间。变量可以在嵌套块中使用,除非在块中声明了同名的变量。
示例1:DECLARE intX INT
gbase> DELIMITER //
gbase> DROP PROCEDURE IF EXISTS dodeclare //
Query OK, 0 rows affected
gbase> CREATE PROCEDURE dodeclare (p1 INT)
BEGIN
DECLARE intX INT;
SET intX = 0;
REPEAT SET intX = intX + 1; UNTIL intX > p1 END REPEAT;
SELECT intX;
END //
Query OK, 0 rows affected
gbase> DELIMITER ;
gbase> CALL dodeclare(1000);
+------+
| intX |
+------+
| 1001 |
+------+
1 row in set
Query OK, 0 rows affected
语法格式:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:
CONTINUE | EXIT
condition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION
| gbase_error_code
这条语句指明了处理程序,它们每个可以作为一个或多个条件来对待。如果这些条件之一发生了,具体指明的语句就会被执行。
参数说明如下:
对于一个CONTINUE命令,在处理器语句执行结束后,当前的程序继续执行。而对于一个EXIT处理器,当前BEGIN...END复合语句的执行被终止。
SQLWARNING是对所有以01开始的SQLSTATE代码的速记。
NOT FOUND是对所有以02开始的SQLSTATE代码的速记。
SQLEXCEPTION是对所有的没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。
示例2:DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1
gbase> DELIMITER //
gbase> DROP PROCEDURE IF EXISTS curdemo //
Query OK, 0 rows affected
gbase> CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE cnt INT DEFAULT 0;
DECLARE s_region CHAR(255);
DECLARE stmp CHAR(255) DEFAULT '';
DECLARE cur_region CURSOR FOR SELECT DISTINCT c_region FROM ssbm.customer ORDER BY c_region LIMIT 1000;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DROP TABLE IF EXISTS products;
CREATE TABLE products(region CHAR(255),count INT);
OPEN cur_region;
REPEAT
FETCH cur_region INTO s_region;
IF NOT done THEN
IF stmp='' THEN
SET stmp=s_region;
SET cnt=1;
END IF;
IF stmp!=s_region THEN
INSERT INTO products(region,count) VALUES(stmp,cnt);
SET cnt=1;
SET stmp=s_region;
END IF;
SET cnt=cnt+1;
END IF;
UNTIL done END REPEAT;
CLOSE cur_region;
INSERT INTO products(region,count) VALUES(stmp,cnt);
END//
Query OK, 0 rows affected
gbase> DELIMITER ;
gbase> CALL curdemo;
Query OK, 1 row affected
gbase> SELECT region,count FROM products;
+-----------------------------------------------------------+-------+
| region | count |
+-----------------------------------------------------------+-------+
| AFRICA | 2 |
| AMERICA | 2 |
| ASIA | 2 |
| EUROPE | 2 |
| MIDDLE EAST | 2 |
+------------------------------------------------------------+-------+
5 rows in set