ITPub博客

首页 > 数据库 > > 控制语句-GOTO语句

控制语句-GOTO语句

作者:GaussDB_数据库 时间:2020-01-16 15:49:52 0 删除 编辑

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

语法

label declaration ::=

goto statement ::=

示例

CREATE OR REPLACE PROCEDURE GOTO_test()
AS
DECLARE
v1 int;
BEGIN
v1 := ;
LOOP
EXIT WHEN v1 > 100;
v1 := v1 + 2;
if v1 > 25 THEN
GOTO pos1;
END IF;
END LOOP;
<<pos1>>
v1 := v1 + 10;
raise info 'v1 is %. ', v1;
END;
/
call GOTO_test();

限制场景

GOTO使用有以下限制场景

  • 不支持有多个相同的GOTO labels目标场景,无论是否在同一个block中。
    复制
    BEGIN
      GOTO pos1; 
      <<pos1>>
      SELECT * FROM ...
      <<pos1>>
      UPDATE t1 SET ...
    END;
  • 不支持GOTO跳转到IF语句,CASE语句,LOOP语句中。
    BEGIN
    GOTO pos1;
    IF valid THEN
    <<pos1>>
    SELECT * FROM ...
    END IF;
    END;
  • 不支持GOTO语句从一个IF子句跳转到另一个IF子句,或从一个CASE语句的WHEN子句跳转到另一个WHEN子句。
    BEGIN 
    IF valid THEN
    GOTO pos1;
    SELECT * FROM ...
    ELSE
    <<pos1>>
    UPDATE t1 SET ...
    END IF;
    END;
  • 不支持从外部块跳转到内部的BEGIN-END块。
    BEGIN
    GOTO pos1;
    BEGIN
    <<pos1>>
    UPDATE t1 SET ...
    END;
    END;
  • 不支持从异常处理部分跳转到当前的BEGIN-END块。但可以跳转到上层BEGIN-END块。
    BEGIN
    <<pos1>>
    UPDATE t1 SET ...
    EXCEPTION
    WHEN condition THEN
    GOTO pos1;
    END;
  • 如果从GOTO到一个不包含执行语句的位置,需要添加NULL语句。
    DECLARE
    done BOOLEAN;
    BEGIN
    FOR i IN 1..50 LOOP
    IF done THEN
    GOTO end_loop;
    END IF;
    <<end_loop>> -- not allowed unless an executable statement follows
    NULL; -- add NULL statement to avoid error
    END LOOP; -- raises an error without the previous NULL
    END;
    /


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3158705/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-01-06

  • 博文量
    2907
  • 访问量
    19248