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语句必须被数据库服务器逐条地执行. 这意味着 ...
随机推荐
- STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- C++普通成员函数的调用形式
#include<iostream> using namespace std; class A { public: int data; void foo(int x) { data = x ...
- MySQL数据库本地事务原理
在经典的数据库理论里,本地事务具备四大特征: 原子性 事务中的所有操作都是以原子的方式执行的,要么全部成功,要么全部失败: 一致性 事务执行前后,所有的数据都应该处于一致性状态---即要满足数据库表的 ...
- 用c#实现编写esp32单片机获取DHT11温度传感器参数
欢迎爱好c#的爱好者,本文章我们将用C#的nanoframework框架来编写获取esp32单片机上的DHT11传感器的温度和湿度 实现我们需要准备配置好esp32的环境可以看看之前写的esp32搭建 ...
- 如何使用c#编写单片机程序
因为个人喜爱想研究单片机,但是不太会c,然后再找资料研究有没有其他的方法发现国外的c# nanoframework 框架可以编写单片机程序,本文我将会用自己踩过的坑来总结一些c#编写单片机的一些经 ...
- Python 单元测试 生产HTML测试报告
使用HTMLTestRunnerNew模块,生成单元测试的html报告,报告标题根据对应测试时间. import unittest from datetime import datetime from ...
- hive 常用日期格式转换
固定日期转换成时间戳select unix_timestamp('2016-08-16','yyyy-MM-dd') --1471276800select unix_timestamp('201608 ...
- 掌握这些常用Linux命令,一起提升工作效率
开始上班了,新一年的奋斗的之路启程了,要继续[奔赴山海,奔赴热爱]. 汪国真在<热爱生命>这首诗中写到:既然选择了远方,便只顾风雨兼程.技术上还是持续精进和学习,远方虽远,要迈开脚步,一步 ...
- 记录常见的问题:encodeURICompnent 解码过程中出现空格 以及 第三方app中使用schema 唤起app
window.location.href 跳转的时候使用了encodeURIComponent编码了部分参数,但是在第三方app中出现了编码过后的参数换行和空格的情况(部分第三方应用或者java程序) ...
- String存放位置
简介 字符串在不同的JDK版本中,存放的位置不同,创建方式不同,存放的位置也不同. 存放位置 JDK1.7以下,无论何种方法创建String对象,位置都位于方法区. JDK1.8及1.8以上,new ...