GBase 8a存储过程所支持的流程结构和语句详解
存储过程所支持的流程结构和语句
GBase 8a MPP Cluster 在存储过程中除支持最基本的结构外,在<过程定义>部分还支持一些用于实现特定逻辑的流程控制结构和语句,这些结构和语句主要用于实现分支和循环。
1.DELIMITER
语法
DELIMITER [Delimiter]
说明
分隔符是通知客户端,已经完成输入一个 SQL 语句的字符或字符串符号,通常使用分号“;”;
在存储过程中,因为其中包含很多语句,每一个都需要一个分号,因此需要选择不太可能出现在语句中的符号作为分隔符,如“//”。
2.BEGIN...END
语法
存储程序(过程和函数)可能包含多个语句,这时就使用 BEGIN...END 复合语句。
[begin_label:] BEGIN
[statement_list]
END [end_label]
说明
statement_list:表示一个或多个语句的列表。多个语句之间使用分号“;”进行分隔;
复合语句可以被标记。end_label 只有在 begin_label 出现后才能使用,并且如果两者都出现,它们必须相同;
要使用多个语句,就需要客户端能发送包含语句分隔符“;”的查询字符串。这可在客户端通过 gbase 命令行使用分隔符更改命令来处理。更改查询结束的分隔符“;”(比如,改为//),允许“;”用在程序体中。
3.DECLARE
语法
DECLARE 语句用来定义各种程序的局部项:局部变量(参看存储过程中的变量),条件和处理器(参看条件和处理器)以及游标(参看游标)。目前不支持 SIGNAL和 RESIGNAL 语句。
4.DECLARE var_name[,...] type [DEFAULT value]
说明
DECLARE 只能被用在 BEGIN...END 复合语句之间,且必须位于其它语句之前。
游标必须在声明处理器变量之前被声明,并且条件必须在声明游标或处理器前声明。
上述语句用来声明局部变量。如果要对变量提供一个默认的值,则包括一个 DEFAULT语句。这个值可以指定为一个表达式,或一个常量。如果 DEFAULT 缺少子句,初始值为 NULL。
局部变量的作用范围在它被声明的BEGIN...END块之间。变量可以在嵌套块中使用,除非在块中声明了同名的变量。
5.SET
语法
SET var_name = expr [, var_name = expr]
说明
存储过程中的 SET 语句是对一般 SET 语句的扩展。引用的变量可以是在一个存储过程或全局服务器变量中声明的;
存储过程中的 SET 语句只是已存在的 SET 语法的部分实现。这允许扩展语法 SET a=x,b=y,...这里可以混用不同的变量类型(局部变量与全局和会话服务器变量)。
这也允许局部变量和一些对系统变量有意义的选项结合起来,在这种情况下,选项虽被认出但被忽略掉。
6.SELECT...INTO...
语法
SELECT col_name[,...] INTO var_name[,...] table_expr
说明
该语句将选出的列存储到变量中。只有单一行的结果才可以被取回。
IF
GBase 8a MPP Cluster 的 IF 结构是一个简单的条件分支结构。
语法
IF <判断条件> THEN
<执行体>
ELSE
<执行体>
END IF;
说明
GBase 8a MPP Cluster 的 IF 结构允许嵌套。
7.IF...THEN...ELSE...END IF
gbase> DELIMITER //
gbase> DROP FUNCTION IF EXISTS fn_count//
Query OK, 0 rows affected
gbase> CREATE FUNCTION fn_count (param VARCHAR(10)) RETURNS INT
BEGIN
SELECT COUNT(*)/3 INTO @count FROM ssbm.customer WHERE c_nation=
'JORDAN';
IF @count<=3 THEN
RETURN @count;
ELSE
RETURN @count/3;
END IF;
END//
Query OK, 0 rows affected
gbase> DELIMITER ;
gbase> SET @result = fn_count ('JORDAN');
Query OK, 0 rows affected
gbase> SELECT @result;
+---------+
| @result |
+---------+
| 131 |
+---------+
1 row in set
8.ITERATE
ITERATE 语句用于实现回到指定位置重复执行,该语句只能出现在 LOOP、REPEAT 和 WHILE 结构中,并且必须为该语句定义要回到的位置的标签,之后在使用该语句处指定该标签。
语法
ITERATE<标签名>
说明
ITERATE 语句通常被放在 IF 结构中以实现根据条件重复执行。
9.CASE
GBase 8a MPP Cluster 使用 CASE 结构处理多路分支的情况,其语法格式有两种,
具体参加如下语法格式。
语法
语法格式 1
CASE
WHEN <条件 1> THEN <执行语句 1>
WHEN <条件 2> THEN <执行语句 2>
...
ELSE <执行语句 X>
END CASE;
说明
当<条件 1>为真值时,<执行语句 1>;
当<条件 2>为真值时,<执行语句 2>;
如果没有匹配的结果值,那么返回 ELSE 后的<执行语句 X>。
语法格式 2
CASE <判定条件>
WHEN <值 1> THEN <执行语句 1>
WHEN <值 2> THEN <执行语句 2>
...
ELSE <执行语句 X>
END CASE;
说明
计算<判定条件>,如果<判定条件>的值等于<值 1>,<执行语句 1>;
如果<判定条件>的值等于<值 2>,<执行语句 2>;
如果没有相匹配的值则执行<执行语句 X>。
注意
CASE 计算也依靠上下文。如果是字符串上下文,返回的结果作为一个字符串,如果是数值上下文,返回结果是小数,实数或整数。
10.LOOP
LOOP 结构是 GBase 8a MPP Cluster 中的一个简单的循环结构,用于重复执行一个或者一组语句。这个循环结构在形式上是个死循环结构,因此在执行体中通常要包括一个条件判断语句和 LEAVE 语句用于退出循环。
语法
LOOP
<执行体>
END LOOP;
11.REPEAT
REPEAT 结构是 GBase 8a MPP Cluster 中比较常见的一种循环结构,该结构会重复执行执行体直到满足退出条件。
语法
REPEAT
<执行体>
UNTIL<退出条件>
END REPEAT;
说明
REPEAT 结构的执行体至少会执行一次,如果不允许这样可以使用 WHILE 结构代替。
12.LEAVE
GBase 8a MPP Cluster 中的 LEAVE 语句用于退出循环结构,因此该语句也只能出现在 LOOP、REPEAT 和 WHILE结构中。同样的,在使用 LEAVE 语句时必须为包含该语句的循环结构定义标签,然后在使用该语句处指定该标签。
语法
LEAVE <标签名>
说明
LEAVE 语句通常被放在 IF 结构中以实现根据条件退出循环结构。
评论
热门帖子
- 12025-12-01浏览数:182763
- 22023-05-09浏览数:25057
- 42023-09-25浏览数:18525
- 52020-05-11浏览数:17528