控制语句
功能描述
控制语句是存储过程的基本组成部分,用来控制语句逻辑,实现分支,循环,跳转等功能。GaussDB 100支持六个控制语句,分别是GOTO、FOR循环、LOOP、WHILE循环、CASE WEHN、IF。
注意事项
- BEGIN和END标示的语句块是最基础的语句块,不允许为空。
- FOR...LOOP和WHILE...LOOP的循环语句块不允许为空。
- LOOP循环语句块必须使用EXIT和CONTINUE,否则会形成死循环。
- 如果语句块已形成死循环且无响应,可以在客户端新起连接,查询系统表DV_SESSIONS获取对应的session ID,然后使用“ALTER SYSTEM KILL session_id;”语句恢复。
GOTO语句
- 语法格式
GOTO label_name;
- 参数说明
label_name
标签名。不能和变量名或用户名冲突。该标签可以在GOTO语句前定义,也可以在GOTO语句后定义。
- 示例(GOTO语句以粗体显示)
<<main>> DECLARE x NUMBER; BEGIN x := 0; GOTO outer_loop; x := 100; <<outer_loop>> LOOP DBMS_OUTPUT.PUT_LINE(' outer in '); <<inner_loop>> LOOP DBMS_OUTPUT.PUT_LINE('Inside loop: x = ' || x); x := x + 1; IF x > 3 THEN DBMS_OUTPUT.PUT_LINE(' BEGIN EXIT '); EXIT inner_loop WHEN x > 4; DBMS_OUTPUT.PUT_LINE(' AFTER EXIT '); ELSE CONTINUE inner_loop WHEN x > 1; END IF; DBMS_OUTPUT.PUT_LINE(' after continue '); END LOOP; DBMS_OUTPUT.PUT_LINE(' outer_loop '); EXIT outer_loop; DBMS_OUTPUT.PUT_LINE(' After loop: x = ' || x); IF x < 6 THEN GOTO inner_loop; END IF; END LOOP; END; /
FOR循环语句
- 语法格式
FOR index_name IN [REVERSE] lower_bound..upper_bound LOOP statements END LOOP;
- 参数说明
- index_name
循环变量的名称。循环变量是FOR...LOOP语句定义的局部变量,如果发生局部变量与外部变量重名,FOR...LOOP语句以局部的为准。
- REVERSE
指定循环变量反向循环。也就是说,使用关键字REVERSE时,循环变量从upper_bound开始到lower_bound结束,进行反向计数。不使用关键字REVERSE时,循环变量正向循环,从lower_bound开始到upper_bound结束,进行正向计数。
- lower_bound..upper_bound
循环变量的边界值。可以是数值或可以计算出数值的运算表达式。lower_bound为低边界值,upper_bound为高边界值。低边界值必须小于高边界值。双点号(..)是范围操作符。
- statements
循环体。不能为空(至少为一条NULL语句),为空会报错。
- 示例(FOR循环以粗体显示)
Declare x bool; BEGIN x := FALSE; FOR i IN 1..3 LOOP DBMS_OUTPUT.PUT_LINE('here:' || i); END LOOP; DBMS_OUTPUT.PUT_LINE('x:' || x); END; /
LOOP语句
- 语法格式
LOOP statements; EXIT [ WHEN condition1 ]; CONTINUE [ WHEN condition2 ]; END LOOP;
- 参数说明
- LOOP/END LOOP
LOOP语句的开始标记和结束标记。LOOP语句一般与IF语句组合使用。
- statements
循环体。不能为空(至少为一条NULL语句),为空会报错。
- EXIT [ WHEN condition1 ]
LOOP语句构造了一个死循环,使用EXIT和CONTINUE控制LOOP语句的循环情况。
condition1指定退出循环操作的条件表达式。该条件为真时,退出循环操作。
- CONTINUE [ WHEN condition2 ]
LOOP语句构造了一个死循环,使用EXIT和CONTINUE控制LOOP语句的循环情况。
condition2指定继续循环操作的条件表达式。该条件为真时,继续循环操作。
- LOOP/END LOOP
- 示例(LOOP语句以粗体显示)
DECLARE x NUMBER; BEGIN x := 0; LOOP DBMS_OUTPUT.PUT_LINE('Inside loop: x = ' || x); x := x + 1; IF x > 10 THEN DBMS_OUTPUT.PUT_LINE(' BEGIN EXIT '); EXIT WHEN x > 20; DBMS_OUTPUT.PUT_LINE(' AFTER EXIT '); END IF; END LOOP; DBMS_OUTPUT.PUT_LINE(' After loop: x = ' || x); END; /
WHILE循环语句
- 语法格式
WHILE condition LOOP statements; END LOOP;
- 参数说明
- condition
条件表达式。条件为真则进入循环,条件为假则跳出循环。
- statements
循环体。不能为空,为空时会报错。
- condition
- 示例(WHILE循环以粗体显示)
DECLARE x NUMBER; BEGIN x := 0; WHILE x <= 1 LOOP DBMS_OUTPUT.PUT_LINE('here:' || x); x := x + 1; END LOOP; END; /
CASE WHEN语句
- 功能描述
使用CASE WHEN语句根据条件来执行一个或多个操作。如果不满足条件,可以选择性地执行其他操作。
- 语法格式
- 简单case函数。
CASE variant_name WHEN expr1 THEN statement1 WHEN expr2 THEN statement2 ELSE statement3 END CASE;
- case搜索函数。
CASE WHEN variant_name = expr1 THEN statement1 WHEN variant_name = expr2 THEN statement2 ELSE statement3 END CASE;
- 参数说明
- 简单case函数。
- variant_name
用于判断执行条件的变量的名称。
- WHEN expr1 THEN statement1
变量值为expr1时,执行statement1。
- WHEN expr2 THEN statement2
变量值为expr2时,执行statement2。
- ELSE statement3
变量值既不满足expr1也不满足expr2时,执行statement3。
- variant_name
- case搜索函数。
- WHEN variant_name = expr1 THEN statement1
“variant_name = expr1”成立时,执行statement1。
- WHEN variant_name = expr2 THEN statement2
“variant_name = expr2”成立时,执行statement2。
- ELSE statement3
“variant_name = expr1”和“variant_name = expr2”均不成立时,执行statement3。
- WHEN variant_name = expr1 THEN statement1
- 简单case函数。
- 示例
- 简单case函数(以粗体显示)。
DECLARE class CHAR(1) := 'S'; age VARCHAR2(15); BEGIN CASE class WHEN 'S' THEN age := '3-4 years'; WHEN 'M' THEN age := '4-5 years'; WHEN 'P' THEN age := '5-6 years'; ELSE age := 'No such class'; END CASE; DBMS_OUTPUT.PUT_LINE(age); END; /
- case搜索函数(以粗体显示)。
DECLARE class CHAR(1) := 'S'; age VARCHAR2(15); BEGIN CASE WHEN class = 'S' THEN age := '3-4 years'; WHEN class = 'M' THEN age := '4-5 years'; WHEN class = 'P' THEN age := '5-6 years'; ELSE age := 'No such class'; END CASE; DBMS_OUTPUT.PUT_LINE(age); END; /
IF语句
- 语法格式
IF condition THEN statement ELSIF condition THEN statement ELSIF ... ELSE statement END IF;
IF控制语句中可嵌套使用IF语句。
- 参数说明
- condition
条件表达式。
- statement
满足条件表达式时的执行语句。
- 示例(IF语句以粗体显示)
DECLARE v_sal INT; BEGIN v_sal := 1; v_sal := v_sal + 1; DBMS_OUTPUT.PUT_LINE('value1:'||v_sal); IF v_sal < 2 THEN DBMS_OUTPUT.PUT_LINE('value2:'||v_sal); ELSIF v_sal = 2 THEN IF v_sal != 2 THEN DBMS_OUTPUT.PUT_LINE('value3:'||v_sal); ELSE DBMS_OUTPUT.PUT_LINE('value3x:'||v_sal); END IF; ELSIF v_sal = 4 THEN DBMS_OUTPUT.PUT_LINE('value4:'||v_sal); ELSE DBMS_OUTPUT.PUT_LINE('value5:'||v_sal); END IF; DBMS_OUTPUT.PUT_LINE('value6:'||v_sal+2); END; /
- 参数说明
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论
- case搜索函数(以粗体显示)。
- 简单case函数(以粗体显示)。
- 参数说明
- case搜索函数。
- 简单case函数。
- 功能描述
- 参数说明
- 语法格式
- 参数说明
- 语法格式
- 参数说明
- 语法格式
- 参数说明