PostgreSQL-PL/pgSQL控制结构
PL/pgSQL的控制结构是最重要及最有用的一部分了,在实际工作场景都离不开业务处理逻辑,在写PL/pgSQL时,利用控制结构来操作数据。PL/pgSQL支持的控制结构与其他语言几乎差不多,比如:条件、循环、异常等,下面就分别介绍控制结构的使用。
1、条件
对于条件控制结构,支持IF与CASE两种,IF语句有如下三种写法:
if ... then ... end if
if ... then ... else ... end if
if ... then ... elsif ... then ... else ... end if
以及CASE有两种写法:
case ... when ... then ... else ... end case
case when ... then ... else ... end case
1.1、IF-THEN
IF 条件表达式 THEN
主体部分
END IF
IF-THEN是IF结构最简单的形式,如果条件为true,则执行主体部分的脚本,否则不执行。例如:
IF id = 1 THEN
update t_order set order_code = '123' where id = 1;
END IF;
1.2、IF-THEN-ELSE
IF 条件表达式 THEN
主体部分
ELSE
主体部分
END IF;
IF-THEN-ELSE语句在IF-THEN增加了条件表达式为false时,执行ELSE部分的脚本。例如:
IF i_name is not null THEN
select account into r_account from t_user t where t.name = i_name ;
ELSE
raise notice '用户名为空';
END IF;
1.3、IF-THEN-ELSIF
IF 条件表达式 THEN
主体部分
ELSIF 条件表达式 THEN
主体部分
ELSE
主体部分
END IF;
IF-THEN-ELSIF支持多个条件,比如第一个条件不满足,进入第二个条件,否则执行ELSE部分,当然ELSE部分可以不写。
IF i_n < 13 THEN
raise notice '小学';
ELSIF i_n >= 13 and i_n <16 THEN
raise notice '初中';
ELSE
raise notice '完了';
END IF;
1.4、CASE
控制结构的CASE与SQL语句里面的CASE写法一样,例如:
CASE 搜索参数
WHEN 值 THEN 主体部分
ELSE 主体部分
END CASE;
或者
CASE
WHEN 条件表达式 THEN 主体部分
ELSE 主体部分
END CASE;
第一种写法,如果搜索参数在给定的值里面,则执行THEN后面语句,否则执行ELSE部分,ELSE部分可以省略。
第二章写法,符合条件表达式执行THEN后面语句,否则执行ELSE部分。例如:
CASE account
WHEN 'zhangsan','lisi' THEN
msg := '账号为zhangsan或lisi'
ELSE
msg := '未找到账号'
END CASE;
或
CASE
WHEN account in ('zhangsan','lisi') THEN
msg := '账号为zhangsan或lisi'
ELSE
msg := '未找到账号'
END CASE;
CASE语句的作用完全与IF-THEN-ELSIF作用一致。
2、循环
在PL/pgSQL中可以用LOOP、FOR、WHILE实现循环,EXIT与CONTINUE控制循环。
2.1、简单循环
[<<label>>]
LOOP
主体部分
END LOOP [label];
直接使用LOOP定义循环,作用就是无条件的循环,如果这样定义,执行这个语句就进入无限循环,除非在主体里面写EXIT与RETURN,才能终止循环。在实际场景这种不加条件的循环很少会用到。这里的label可选,如果加了label,可以由EXIT与CONTINUE语句使用,比如嵌套循环,最里层循环想直接跳到最外层定义的label就可以使用EXIT label跳到指定的label位置。
2.1.1 、EXIT
EXIT [label] [WHEN 条件表达式]
EXIT后面有两可选部分,给出label部分,则退出到指定的label,如果没指定,则退出当前循环,WHEN部分,则表示符合条件表达式,才退出。
2.1.2、CONTINUE
CONTINUE [label] [WHEN 条件表达式]
CONTINUE的语法与EXIT类似,后面跟的两部分作用也一样,唯一的差别就是EXIT退出循环,CONTINUE是退出本次循环进入下一次循环。
2.2 、FOR循环
2.2.1、简单循环
[<<label>>]
FOR name IN [REVERSE] 表达式..表达式 [BY 表达式] LOOP
主体部分
END LOOP [label];
这种形式的FOR对一定范围的整数进行迭代的循环。 变量name会自动定义为BY类型并且只在循环里存在 (任何该变量名的现存定义在此循环内都将被忽略)。 给出范围上下界的两个表达式在进入循环的时候计算一次。 BY子句指定迭代步长(缺省为 1), 但如果声明了REVERSE步长将变为相应的负值。
--循环输出1..10
for i in 1..10 loop
raise notice '%',i;
end loop;
--从10..1输出,这时就需要加上reverse
for i in reverse 10..1 loop
raise notice '%',i;
end loop;
--从1..10,每隔两个输出
for i in 1..10 by 2 loop
raise notice '%',i;
end loop;
2.2.2、循环查询结果
循环查询结果,在实际场景使用得更多,语法如下:
[<<label>>]
for target in 查询语句 loop
主体部分
end loop [label];
target是一个记录变量,必须在declare部分先声明,比如声明用户信息:us_info record,完整案例如下:
do $$
declare
t_o record;
begin
for t_o in (select * from t_order) loop
raise notice 'ID:%,客户:%',t_o.id,t_o.cus_name;
end loop;
end $$;
2.3、WHILE循环
[<<label>>]
while 条件表达式 loop
主体部分
end loop [label]
while循环,只要符合条件表达式,就会一直循环,例如:
do $$
declare
i int := 10;
begin
while i != 0 loop
raise notice '%',i;
i := i-1;
end loop;
end $$;
3、异常
任何程序都不可能不出错,然而有时我们需要捕获异常继续处理或更好的将异常信息提示给用户,PL/pgSQL异常结构如下:
[<<label>>]
[declare
声明部分]
begin
主体部分
exception
when 异常名称 then
异常处理
end [label];
只要出现异常,就会进入exception部分,然后被识别到对于的when中,比如:
do $$
declare
x int:=6;
begin
x := x/0;
exception
when division_by_zero then
raise notice '除数不能为0';
end $$;
PostgreSQL-PL/pgSQL控制结构的更多相关文章
- postgresql PL/pgSQL—存储过程结构和变量声明
ref: https://www.postgresql.org/docs/9.6/static/plpgsql-structure.html 一. 函数结构 CREATE FUNCTION somef ...
- PostgreSQL存储过程(2)-基于PL/PgSQL的存储过程
介绍 PL/pgSQL 是PostgreSQL 数据库系统的一个可加载的过程语言. PL/pgSQL 的设计目标是创建一种可加载的过程语言,可以 用于创建函数和触发器过程, 为SQL 语言增加控制结构 ...
- 用PL/pgSQL写postgreSQL的存储过程[转]
http://blog.chinaunix.net/uid-7591044-id-1742967.html 今天学会了用 PL/pgSQL 写 postgreSQL 的存储过程,网上资料实在少得可怜, ...
- PL/pgSQL学习笔记之一
开始 资料来源:http://www.postgresql.org/docs/9.1/static/plpgsql-overview.html 39.1 概要: PL/pgSQL是一种可载入的过程语言 ...
- PL/pgSQL学习笔记之八
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 另外一种声明 PL/pgSQL 函数的方法是使用 returns ...
- PL/pgSQL学习笔记之七
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 如果一个PL/pgSQL函数声明了输出参数,输出参数被赋予$n名 ...
- PL/pgSQL学习笔记之五
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3. 声明 块中使用的所有的变量必须在块的声明节中进行声明 ...
- PL/pgSQL学习笔记之四
http://www.postgresql.org/docs/9.1/static/plpgsql-structure.html 39.2. PL/pgSQL 的结构 PL/pgSQL是一种块式结构的 ...
- PL/pgSQL学习笔记之三
http://www.postgresql.org/docs/9.1/static/plpgsql-overview.html 39.1.2. Supported Argument and Resul ...
- PL/pgSQL学习笔记之二
39.1.1 使用 PL/pgSQL的好处 SQL是 PostgreSQL和其他大多数关系型数据库作为查询语言而使用的语言.它可移植,并容易学习.但是SQL语句必须被数据库服务器逐条地执行. 这意味着 ...
随机推荐
- 多线程-创建线程第二种方式-实现Runnable接口-细节和好处
1 package multithread2; 2 3 /* 4 * 创建线程的第一种方法:继承Thread类 5 * 6 * 创建线程的第二种方式:实现Runnable接口 7 * 8 * 1,定义 ...
- How to check in Windows if you are using UEFI
You might be wondering if Windows is using UEFI or the legacy BIOS, it's easy to check. Just fire up ...
- NSURLConnection和Runloop(面试)
(1)两种为NSURLConnection设置代理方式的区别 //第一种设置方式: //通过该方法设置代理,会自动的发送请求 // [[NSURLConnection alloc]initWithRe ...
- HTTPS 原理详解 (转)
HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷 ...
- jsp include html 乱码问题
感谢大佬:https://blog.csdn.net/sessionsong/article/details/38778853 在使用<%@ include page=""% ...
- Ajax向服务器发起请求
Ajax向服务器发起请求的三个步骤: 1:创建Ajax 2:打开Ajax,打开Ajax请求 3:向服务器发起请求:需要知道地址和是get请求还是post方法 向服务器发起请求的两个方法:open 和 ...
- 简述keepalived工作原理
1.Keepalived 定义 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障.一个LVS服务会有2台服务器运行Keepalived,一台为主服务器 ...
- 一加6刷入kali nethunter
Installing Kali NetHunter On the OnePlus 6 准备工具: adb: https://jingyan.baidu.com/article/22fe7cedf67e ...
- 学多少年才算“精通Java”?
我从毕业做程序员就开始用 Java,到现在已经工作快 20 年了.减去我做手游用 C++.Lua 的几年,再减去后来转管理写代码少的时间,我真正写 Java 代码的时间至少也在 10 年以上. 如果你 ...
- 再见收费的Navicat!操作所有数据库就靠它了!
作为一名开发者,免不了要和数据库打交道,于是我们就需要一款顺手的数据库管理工具.很长一段时间里,Navicat 都是我的首选,但最近更换了一台新电脑,之前的绿色安装包找不到了. 于是就琢磨着,找一款免 ...