GBase 8s 存储过程解析之DECLARE

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

上一篇:秒杀功能


下一篇:knife4j使用AfterScript实现自动set token