暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T 控制语句

墨天轮 2019-10-12
1150

控制语句

功能描述

控制语句是存储过程的基本组成部分,用来控制语句逻辑,实现分支,循环,跳转等功能。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语句以粗体显示)
    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

      循环体。不能为空,为空时会报错。

  • 示例(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。

    • 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。

  • 示例
    • 简单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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论