语法格式:
[begin_label:] BEGIN
[statement_list]
END [end_label]
存储程序(过程和函数)可能包含多个语句,这时就使用 BEGIN ... END复合语句。
statement_list:表示一个或多个语句的列表。多个语句之间使用分号“;”
进行分隔。
复合语句可以被标记。end_label 只有在 begin_label 出现后才能使用,并且
如果两者都出现,它们必须相同。
要使用多个语句,就需要客户端能发送包含语句分隔符“;”的查询字符串。
这可在客户端通过 gbase 命令行使用分隔符更改命令来处理。更改查询结束的分
隔符“;”(比如,改为//),允许“;”用在程序体中。
7.3 DECLARE
DECLARE 语句用来定义各种程序的局部项:局部变量(参看存储过程中
的变量),条件和处理器(参看条件和处理器)以及游标(参看游标)。目前
不支持 SIGNAL 和 RESIGNAL 语句。
DECLARE 只能被用在 BEGIN ... END 复合语句之间,且必须位于其它语句
之前。
游标必须在声明处理器变量之前被声明,并且条件必须在声明游标或处理
器前声明。
语法格式一:
DECLARE var_name[,...] type [DEFAULT value]
这个语句用来声明局部变量。如果要对变量提供一个默认值,则包括一个
DEFAULT 语句。这个值可以指定为一个表达式,或一个常量。如果 DEFAULT
缺少子句,初始值为 NULL。
局部变量的作用范围在它被声明的 BEGIN ... END 块之间。变量可以在嵌
套块中使用,除非在块中声明了同名的变量。
7.4 SET
语法格式:
SET var_name = expr [, var_name = expr] ...
存储过程中的 SET 语句是对一般 SET 语句的扩展。引用的变量可以是在一
个存储过程或全局服务器变量中声明的。
存储过程中的 SET 语句只是已存在的 SET 语法的部分实现。这允许扩展语
法 SET a=x,b=y,...这里可以混用不同的变量类型(局部变量与全局和会话服
务器变量)。这也允许局部变量和一些对系统变量有意义的选项结合起来;在
这种情况下,选项虽被认出但被忽略掉。
7.5 SELECT ...INTO...
语法格式:
SELECT col_name[,...] INTO var_name[,...] table_expr
功能:
将选出的列存储到变量中。只有单一行的结果才可以被取回。
7.6 IF
GBase 8a 的 IF 结构是一个简单的条件分支结构。
语法格式:
IF <判断条件> THEN
<执行体>
ELSE
<执行体>
END IF;
GBase 8a 的 IF 结构允许嵌套。
7.7 ITERATE
ITERATE 语句用于实现回到指定位置重复执行,该语句只能出现在 LOOP、
REPEAT 和 WHILE 结构中,并且必须为该语句定义要回到的位置的标签,之后
在使用该语句处指定该标签。
语法格式:
ITERATE<标签名>
ITERATE 语句通常被放在 IF 结构中以实现根据条件重复执行。
7.8 CASE
GBase 8a 使用 CASE 结构处理多路分支的情况,其语法格式有两种,分别
描述如下:
CASE
WHEN <条件> THEN <执行语句>
WHEN <条件> THEN <执行语句>
...
GBase 8a SQL 参考手册
- 738 - 南大通用数据技术股份有限公司
ELSE <执行语句>
END CASE ;
当<条件>为真值时,<执行语句>;当<条件>为真值时,<执行语句>;
如果没有匹配的结果值,那么返回 ELSE 后的<执行语句>。
CASE <判定条件>
WHEN <值> THEN <执行语句>
WHEN <值> THEN <执行语句>
...
ELSE <执行语句>
END CASE ;
计算<判定条件>,如果<判定条件>的值等于<值>,<执行语句>;如果<判定条件>的值等于<值>,<执行语句>;如果没有相匹配的值则执行<执行>。
REPEAT 结构是 GBase 8a 中比较常见的一种循环结构,该结构会重复执行
执行体直到满足退出条件。
语法格式:
REPEAT
<执行体>
UNTIL<退出条件>
END REPEAT ;REPEAT 结构的执行体至少会执行一次,如果不允许这样可以使用 WHILE
结构代替。
7.11WHILE
WHILE 是 GBase 8a 中另一种常见的循环结构,在满足执行条件时该结构会
重复执行执行体。
语法格式:
WHILE <执行条件> DO
<执行体>
END WHILE ;
WHILE 结构在逻辑上与 REPEAT 一致,唯一不同的是 until 结构中的执行
体至少会执行一次,而 WHILE 结构中的执行体则可能一次也不执行。
gbase> DELIMITER //
gbase> DROP PROCEDURE IF EXISTS docursor //
Query OK, 0 rows affected
gbase> CREATE PROCEDURE docursor()
BEGIN DECLARE s_region VARCHAR(40);
DECLARE DONE INT DEFAULT(0);
DECLARE cur CURSOR FOR SELECT DISTINCT c_region FROM
ssbm.customer ORDER BY c_region LIMIT 6;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO s_region;
IF NOT done THEN
SELECT s_region;
END IF;
UNTIL DONE END REPEAT;
CLOSE cur;
END //
Query OK, 0 rows affected
gbase> DELIMITER ;
gbase> CALL docursor();
+----------+
| s_region |
+----------+ | AFRICA |
+----------+
1 row in set
+----------+
| s_region |
+----------+
| AMERICA |
+----------+
1 row in set
+----------+
| s_region |
+----------+
| ASIA |
+----------+
1 row in set
+----------+
| s_region |
+----------+ | EUROPE |
+----------+
1 row in set
+-------------+
| s_region |
+-------------+
| MIDDLE EAST |
+-------------+
1 row in set
Query OK, 0 rows affected
通过动态 SQL,动态游标 OPEN 语句中的 SELECT 语句可以由文本字符串
或者内容为文本字符串的用户变量表示。
语法格式:
OPEN <游标名称> FOR
参数说明如下:
:打开动态游标的动态 SQL 语句。
7.14.6 动态游标使用注意事项
动态游标使用时需注意如下事项:
(1)动态游标在 DECLARE 时,不允许指定任何 SELECT 语句。
(2)动态游标允许嵌套,如果在嵌套中有 OPEN 操作,必须在同一嵌套中
有 CLOSE 操作与 OPEN 操作成对出现,避免重复 OPEN 操作的错误。
(3)动态游标只能用在存储过程中。
八 存储程序(过程、函数)的限制
函数使用限制:
不支持 DML,DDL,创建临时表。
不支持函数里面涉及 SQL 查询语句,但没有禁止。
不支持下列方式给变量赋值。
例如:
DECLARE res INT DEFAULT 0;
SET res=(SELECT COUNT(*) FROM t);
或:SELECT COUNT(*) INTO @res FROM t;