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 搜索参数
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中可以用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 $$;

PostgreSQL-PL/pgSQL控制结构的更多相关文章

  1. postgresql PL/pgSQL—存储过程结构和变量声明

    ref: https://www.postgresql.org/docs/9.6/static/plpgsql-structure.html 一. 函数结构 CREATE FUNCTION somef ...

  2. PostgreSQL存储过程(2)-基于PL/PgSQL的存储过程

    介绍 PL/pgSQL 是PostgreSQL 数据库系统的一个可加载的过程语言. PL/pgSQL 的设计目标是创建一种可加载的过程语言,可以 用于创建函数和触发器过程, 为SQL 语言增加控制结构 ...

  3. 用PL/pgSQL写postgreSQL的存储过程[转]

    http://blog.chinaunix.net/uid-7591044-id-1742967.html 今天学会了用 PL/pgSQL 写 postgreSQL 的存储过程,网上资料实在少得可怜, ...

  4. PL/pgSQL学习笔记之一

    开始 资料来源:http://www.postgresql.org/docs/9.1/static/plpgsql-overview.html 39.1 概要: PL/pgSQL是一种可载入的过程语言 ...

  5. PL/pgSQL学习笔记之八

    http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 另外一种声明 PL/pgSQL 函数的方法是使用 returns ...

  6. PL/pgSQL学习笔记之七

    http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 如果一个PL/pgSQL函数声明了输出参数,输出参数被赋予$n名 ...

  7. PL/pgSQL学习笔记之五

    http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3. 声明 块中使用的所有的变量必须在块的声明节中进行声明 ...

  8. PL/pgSQL学习笔记之四

    http://www.postgresql.org/docs/9.1/static/plpgsql-structure.html 39.2. PL/pgSQL 的结构 PL/pgSQL是一种块式结构的 ...

  9. PL/pgSQL学习笔记之三

    http://www.postgresql.org/docs/9.1/static/plpgsql-overview.html 39.1.2. Supported Argument and Resul ...

  10. PL/pgSQL学习笔记之二

    39.1.1 使用 PL/pgSQL的好处 SQL是 PostgreSQL和其他大多数关系型数据库作为查询语言而使用的语言.它可移植,并容易学习.但是SQL语句必须被数据库服务器逐条地执行. 这意味着 ...

随机推荐

  1. gin框架中集成casbin-权限管理

    概念 权限管理几乎是每个系统或者服务都会直接或者间接涉及的部分. 权限管理保障了资源(大部分时候就是数据)的安全, 权限管理一般都是和业务强关联, 每当有新的业务或者业务变化时, 不能将精力完全放在业 ...

  2. 学习Java第10天

    今天所作的工作: 1.线程 2.网络通信 明天工作安排: 做点教材后的案例,复习所学内容 总结一下,10天的时间,看完了Java从入门到精通,只能说是看完了,这里加一个表情笑哭,应该算是知道Java的 ...

  3. pycharm 安装插件

    1.使用pip安装插件 pip安装指定版本的插件: pip install openpyxl==2.6.2 -i https://pypi.doubanio.com/simple/ -i后面跟的是&q ...

  4. LeetCode 每日一题 458. 可怜的小猪

    题目描述 有 buckets 桶液体,其中 正好 有一桶含有毒药,其余装的都是水.它们从外观看起来都一样.为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断.不幸的是,你只有 m ...

  5. NumPy 教程目录

    NumPy 教程目录 1 Lesson1--NumPy NumPy 安装 2 Lesson2--NumPy Ndarray 对象 3 Lesson3--NumPy 数据类型 4 Lesson4--Nu ...

  6. react-(错误代码#31----Minified React error #31)

    错误描述:Uncaught Invariant Violation: Minified React error #31; visit http://facebook.github.io/react/d ...

  7. AT2650 [ARC077C] guruguru

    可以发现,如果我们枚举每个理想亮度 \(X\) 然后再求在这个理想亮度情况下的答案是非常难维护的. 不妨反过来,考虑每个位置 \(i, i + 1\) 之间对每个理想亮度 \(X\) 减少次数的贡献. ...

  8. JAVA多线程学习八-多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  9. list和tuple的用法区别

    1.list中是可变的,tuple不可变  所以tuple没有insert, pop,append方法 2.定义只有一个元素的tuple的时候,必须加逗号,否则不会被认为是tuple,而被识别为括号 ...

  10. 「 题解 」P2487 [SDOI2011]拦截导弹

    简单题意 给定 \(n\) 个数对 \((h_i, v_i)\). 求: 最长不上升子序列的长度. 对于每个 \(i\),分别求出包含数对 \((h_i, v_i)\) 的最长上升子序列的个数和最长不 ...