数据库版本:KingbaseES V008R006C008B0014
简介
匿名块是一种特殊的代码块,用于在数据库中执行一系列的SQL语句或PLSQL语句。它们通常用于执行一些简单的逻辑或者在数据库中执行一些事务性操作(在匿名块中定义的一系列语句可以被视为1个事务),执行的操作要么全部成功,要么全部失败,从而保证数据的一致性。
文章目录如下
1. 基本语法
1.1. 语法说明
1.2. 常用符号
2. 控制语句
2.1. 判断语句
2.2. 循环控制
3. 应用案例
3.1. 批量插入数据
3.2. 插入关联表数据
1. 基本语法
1.1. 语法说明
DO $$ --[必选]创建匿名代码块的语法
DECLARE --[可选]用于声明变量或游标/*声明变量或游标*/
BEGIN --[必选]定义代码块的开始/*执行语句*/
END; --[必选]定义代码块的结束
$$; --[必选]DO后面声明了该符号为结束符,所以在最后使用表示匿名块结束
举个例子
DO $$
DECLAREid INTEGER := 10;
BEGINRAISE NOTICE '这是一个匿名块, id = %', id;
END
$$;
1.2. 常用符号
运算符(加,减,乘,除)
+ - * /逻辑运算符(大于,小于,等于,不等于,大于等于,小于等于)
> < = != >= <=赋值符
:= # a := 10属性标识符
%连接符
|| # a := aaa || bbb || ccc注释符
-- [注释内容] #单行注释
/* [注释内容] */ #多行注释,/* 表示开始,*/ 表示结束
2. 控制语句
2.1. 判断语句
匿名块也支持 if 判断,它的格式和函数/存储过程一样,都是写在 BEGIN..END 中。语法如下:
IF <条件1> THEN -- 第1次判断<执行命令1>
ELSIF <条件2> THEN -- 第2次判断<执行命令2>
ELSE -- 前面判断都为T,执行这里<执行命令n>
END IF; -- 结束符
举个例子:
DO $$
DECLAREtotal_amount INT := 1000;
BEGIN-- 判断订单总金额是否超过阈值IF total_amount > 500 THEN-- 如果订单总金额大于500,打印订单金额较大的消息RAISE NOTICE '订单金额较大:%,请注意处理。', total_amount;ELSE-- 如果订单总金额不大于500,打印订单金额较小的消息RAISE NOTICE '订单金额较小:%,可以正常处理。', total_amount;END IF;
END;
$$;
2.2. 循环控制
"循环语句" 与 "判断语句" 差不多,也是写在 BEGIN..END 中。语法如下:
【语法一】遍历序列
FOR i IN 1..100 LOOP -- 循环1~100<命令块>
END LOOP;
这个序列不仅仅可以是 n~n,也可以是 SELECT 查询到的一系列数据
【语法二】while 判断循环
WHILE <条件> LOOP -- 条件为Ture:执行<命令块>
END LOOP; -- 结束符
【语法三】loop 无限循环
LOOP -- 无限循环开始<命令块>
END LOOP; -- 无限循环结束符
跳出循环关键字:
- EXIT:跳出整个循环
- CONTINUE:跳出当前循环
3. 应用案例
3.1. 批量插入数据
DO $$
BEGINFOR i IN 1..10000 LOOP-- 向t1表中插入1w行数据INSERT INTO t1 VALUES(i, 'abc');END LOOP;
END;
$$ ;
3.2. 插入关联表数据
DO $$
BEGIN/*循环遍历查询t2表的结果*/FOR i IN (SELECT id FROM t2) LOOP/*根据结果大小插入不同的数据*/IF i < 100 THEN<插入数据xxx1>ELSIF i < 500 THEN<插入数据xxx2>ELSE<插入数据xxx3>END IF;END LOOP;
END;
$$ ;