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、语法

sql 复制代码
BEGIN
     --some code here
     IF condition THEN
        GOTO label;
     END IF;
     
     -- some code here  
   GOTO label;
		
<<label>>
-- code to jump to

END;
/

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

1、基础示例

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

sql 复制代码
CREATE OR REPLACE FUNCTION  proc_goto(i in integer,j in integer)
RETURNS TEXT
LANGUAGE plpgsql
AS $$
  BEGIN  
     LOOP
         INSERT INTO test_1(id,date) VALUES(i,current_date) ;
	     i := i+1;      
         IF i=j THEN  
		  	 GOTO label;					 
         END IF;  
     END LOOP;
			
     <<label>>			
   INSERT INTO test_1(id,date) VALUES(i,'3000-12-31') ;
			
	 RETURN 'succeed';
  END $$;
 
CALL proc_goto(1,5);

select * from test_1;

2、限制场景说明

GOTO 使用有以下限制场景:

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

sql 复制代码
BEGIN
  GOTO label 1; 
  << label 1>>
  SELECT * FROM ...
  << label 1>>
  UPDATE t1 SET ...
END;

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

sql 复制代码
BEGIN
   GOTO label 1; 
   IF valid THEN
     << label 1>>
     SELECT * FROM ...
   END IF;
 END;

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

sql 复制代码
BEGIN 
   IF valid THEN
     GOTO label 1;
     SELECT * FROM ...
   ELSE
     << label 1>>
     UPDATE t1 SET ...
   END IF;
 END;

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

sql 复制代码
BEGIN
   GOTO label 1;  
   BEGIN
     << label 1>>
     UPDATE t1 SET ...
   END;
 END;

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

sql 复制代码
BEGIN
   << label 1>>
   UPDATE t1 SET ...
   EXCEPTION
     WHEN condition THEN
        GOTO label 1;
 END;

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

sql 复制代码
DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         GOTO end_loop;
      END IF;
      <<end_loop>>  
      NULL; 
   END LOOP;  
END;
/

四、小结

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

------结束

相关推荐
Gauss松鼠会2 天前
GaussDB的向量化处理技术
运维·数据库·database·gaussdb
Gauss松鼠会2 天前
GaussDB Ustore存储引擎解读
java·前端·数据库·gaussdb
hong1616884 天前
GaussDB Ustore存储引擎解读
java·数据库·gaussdb
工业甲酰苯胺6 天前
深度解读GaussDB逻辑解码技术原理
数据库·oracle·gaussdb
莫凡的博客7 天前
GaussDB和Oracle的语法对比
数据库·oracle·gaussdb
倾歌为君的018 天前
openGauss开源数据库实战十四
数据库·开源·centos·gaussdb
API开发9 天前
测试华为GaussDB(DWS)数仓,并通过APISQL快速将(表、视图、存储过程)发布为API
数据仓库·sql·postgresql·华为云·api·gaussdb·apisql
kiwixing11 天前
gaussdb hccdp实验练习03 GaussDB数据库应用程序开发实验
数据库·gaussdb
华为云开发者联盟11 天前
深度解读GaussDB逻辑解码技术原理
数据库·sql·gaussdb·华为云drs
kiwixing12 天前
gaussdb hccdp实验练习02 GaussDB数据库开发设计
数据库·数据库开发·gaussdb