• GaussDB SQL基础语法示例-GOTO语句


    目录

    一、前言

    二、在GaussDB数据库中的概念及语法

    1、基本概念

    2、语法

    三、在GaussDB数据库中的基础示例和限制场景说明

    1、基础示例

    2、限制场景说明

    、小结

    一、前言

    SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。

    本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。

    GOTO 语句是直观基本的控制流语句,会导致控制流发生无条件更改。它用于分流至使用 SQL 过程中定义的标签的特定用户定义位置。

    使用 GOTO 语句通常被视为缺乏编程技巧,并且不推荐这样做。大量使用 GOTO 会导致代码可读性不好,特别是在过程变长时。此外,因为有更好的语句可用于控制执行路径,所以 GOTO 并非必需。没有需要使用 GOTO 的特定情况;使用它通常只是为了方便。

    二、在GaussDB数据库中的概念及语法

    1、基本概念

    GOTO语句是一种控制语句,它用于无条件地将程序的执行跳转到指定的位置。在GaussDB数据库的SQL实现中,GOTO语句通常被用于存储过程和触发器等数据库对象中,以实现复杂的逻辑控制。

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

    2、语法

    1. BEGIN
    2. --some code here
    3. IF condition THEN
    4. GOTO label;
    5. END IF;
    6. -- some code here
    7. GOTO label;
    8. <<label>>
    9. -- code to jump to
    10. END;
    11. /

    三、在GaussDB数据库中的基础示例和限制场景说明

    1、基础示例

    创建一个函数,在满足一定条件时,通过GOTO语句进行跳转。

    1. CREATE OR REPLACE FUNCTION proc_goto(i in integer,j in integer)
    2. RETURNS TEXT
    3. LANGUAGE plpgsql
    4. AS $$
    5. BEGIN
    6. LOOP
    7. INSERT INTO test_1(id,date) VALUES(i,current_date) ;
    8. i := i+1;
    9. IF i=j THEN
    10. GOTO label;
    11. END IF;
    12. END LOOP;
    13. <<label>>
    14. INSERT INTO test_1(id,date) VALUES(i,'3000-12-31') ;
    15. RETURN 'succeed';
    16. END $$;
    17. CALL proc_goto(1,5);
    18. select * from test_1;

    2、限制场景说明

    GOTO使用有以下限制场景:

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

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

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

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

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

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

    4、不支持从外部块跳转到内部的BEGIN-END块,即禁止从外层跳转到内层。

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

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

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

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

    1. DECLARE
    2. done BOOLEAN;
    3. BEGIN
    4. FOR i IN 1..50 LOOP
    5. IF done THEN
    6. GOTO end_loop;
    7. END IF;
    8. <<end_loop>>
    9. NULL;
    10. END LOOP;
    11. END;
    12. /

    四、小结

    在本文中,我们介绍了GOTO语句在云数据库GaussDB  SQL中的使用特点,通过一系列的示例,可以更好地组织代码,避免一些不必要的计算和操作,从而提高SQL语句的执行效率。  但同时需要注意的是,GOTO语句虽然可以用于实现复杂的逻辑控制,但也容易导致代码的可读性降低和维护困难。因此,在实际开发中,应该根据具体情况慎重使用GOTO语句。

    ——结束

  • 相关阅读:
    JAVA - 方法使用的扩展
    P1195 口袋的天空-Kruskal(优先队列+并查集)
    洛谷 P1021 邮票面值设计
    一文剖析 PolarDB HTAP 的列存数据压缩
    驱动执行流程分析
    北京小程序开发如何选择开发团队与开发语言?
    Vivado使用记录(未完待续)
    TypeScript(二)
    python爬虫下载音乐
    【Java 进阶篇】JavaScript JSON 语法入门:轻松理解数据的序列化和反序列化
  • 原文地址:https://blog.csdn.net/GaussDB/article/details/134500650