PostgreSQL-PL/pgSQL控制结构

PL/pgSQL的控制结构是最重要及最有用的一部分了,在实际工作场景都离不开业务处理逻辑,在写PL/pgSQL时,利用控制结构来操作数据。PL/pgSQL支持的控制结构与其他语言几乎差不多,比如:条件循环异常等,下面就分别介绍控制结构的使用。

1、条件

对于条件控制结构,支持IFCASE两种,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-THENIF结构最简单的形式,如果条件为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

控制结构的CASESQL语句里面的CASE写法一样,例如:

CASE 搜索参数
	WHENTHEN 主体部分
	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中可以用LOOPFORWHILE实现循环,EXITCONTINUE控制循环。

2.1、简单循环

[<<label>>]
LOOP
	主体部分
END LOOP [label];

直接使用LOOP定义循环,作用就是无条件的循环,如果这样定义,执行这个语句就进入无限循环,除非在主体里面写EXITRETURN,才能终止循环。在实际场景这种不加条件的循环很少会用到。这里的label可选,如果加了label,可以由EXITCONTINUE语句使用,比如嵌套循环,最里层循环想直接跳到最外层定义的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 $$;
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。本课程作为PostgreSQL数据库管理一,主要讲解以下内容: 1.     PostgreSQL 存储过程基本知识2.     PostgreSQL 用户自定义函数3.     PostgreSQL 控制结构4.     PostgreSQL 游标和存储过程5.     PostgreSQL 索引6.     PostgreSQL 视图7.     PostgreSQL 触发器8.     PostgreSQL 角色、备份和还原9.     PostgreSQL 表空间管理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小老虎Love

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值