华为云云数据库GaussDBGOTO语句_云淘科技

GOTO语句可以实现从GOTO位置到目标语句的无条件跳转。GOTO语句会改变原本的执行逻辑,因此应该慎重使用,或者也可以使用EXCEPTION处理特殊场景。当执行GOTO语句时,目标Label必须是唯一的。

语法

label declaration ::=

goto statement ::=

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
gaussdb=# CREATE OR REPLACE PROCEDURE GOTO_test()
AS 
DECLARE
    v1  int;
BEGIN
    v1  := 0;
        LOOP
        EXIT WHEN v1 > 100;
                v1 := v1 + 2;
                if v1 > 25 THEN
                        GOTO pos1;
                END IF;
        END LOOP;
<>
v1 := v1 + 10;
raise info 'v1 is %. ', v1;
END;
/

call GOTO_test();

限制场景

GOTO使用有以下限制场景

不支持有多个相同的GOTO labels目标场景,无论是否在同一个block中。

1
2
3
4
5
6
7
BEGIN
  GOTO pos1; 
  <>
  SELECT * FROM ...
  <>
  UPDATE t1 SET ...
END;

不支持GOTO跳转到IF语句,CASE语句,LOOP语句中。

1
2
3
4
5
6
7
BEGIN
   GOTO pos1; 
   IF valid THEN
     <>
     SELECT * FROM ...
   END IF;
 END;

不支持GOTO语句从一个IF子句跳转到另一个IF子句,或从一个CASE语句的WHEN子句跳转到另一个WHEN子句。

1
2
3
4
5
6
7
8
9
BEGIN 
   IF valid THEN
     GOTO pos1;
     SELECT * FROM ...
   ELSE
     <>
     UPDATE t1 SET ...
   END IF;
 END;

不支持从外部块跳转到内部的BEGIN-END块。

1
2
3
4
5
6
7
BEGIN
   GOTO pos1;  
   BEGIN
     <>
     UPDATE t1 SET ...
   END;
 END;

不支持从异常处理部分跳转到当前的BEGIN-END块。但可以跳转到上层BEGIN-END块。

1
2
3
4
5
6
7
BEGIN
   <>
   UPDATE t1 SET ...
   EXCEPTION
     WHEN condition THEN
        GOTO pos1;
 END;

如果从GOTO到一个不包含执行语句的位置,需要添加NULL语句。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         GOTO end_loop;
      END IF;
      <>  -- not allowed unless an executable statement follows
      NULL; -- add NULL statement to avoid error
   END LOOP;  -- raises an error without the previous NULL
END;
/

父主题: 控制语句

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家