流程控制

讲解条件语句,循环语句。

本次环境会用到表emp;下面是emp执行语句。

drop table emp;
create table EMP(
EMPNO numeric(4) not null,
ENAME varchar(10),
JOB varchar(9),
MGR numeric(4),
HIREDATE date,
SAL numeric(7 ),
COMM numeric(7 ),
DEPTNO numeric(2)); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, to_date('1980-12-17', 'YYYY-MM-DD'), 800, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('1981-02-20', 'YYYY-MM-DD'), 1600, 300, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, to_date('1981-02-22', 'YYYY-MM-DD'), 1250, 500, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, to_date('1981-04-02', 'YYYY-MM-DD'), 2975, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('1981-09-28', 'YYYY-MM-DD'), 1250, 1400, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, to_date('1981-05-01', 'YYYY-MM-DD'), 2850, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, to_date('1981-06-09', 'YYYY-MM-DD'), 2450, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, to_date('1987-04-19', 'YYYY-MM-DD'), 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, to_date('1981-11-17', 'YYYY-MM-DD'), 5000, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, to_date('1981-09-08', 'YYYY-MM-DD'), 1500, 0, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, to_date('1987-05-23', 'YYYY-MM-DD'), 1100, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, to_date('1981-12-03', 'YYYY-MM-DD'), 950, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566,to_date('1981-12-02', 'YYYY-MM-DD'), 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, to_date('1982-01-23', 'YYYY-MM-DD'), 1300, null, 10);

1. 条件语句

 IF和CASE语句让你可以根据某种条件执行命令。

 PL/pgSQL有三种形式的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条件语句

语法结构:

IF search_condition THEN
statement_list
END IF;
-----------------------
IF search_condition THEN
statement_list
ELSE
statement_list
END IF;
-----------------------
IF search_condition THEN
statement_list
ELSIF search_condition THEN
statement_list
ELSE
statement_list
END IF;

案例1:给员工薪水少于1500元提示“多加工资”;反之。

CREATE OR REPLACE FUNCTION if_test(vc_empno NUMERIC)
RETURNS void
AS $$
DECLARE
vn_sal numeric;
BEGIN
select sal into vn_sal from emp where empno = vc_empno;
IF vn_sal is null THEN
RAISE NOTICE '该员工不存在!';
ELSIF vn_sal < 1500 THEN
RAISE NOTICE '老板;请多加点工资';
ELSE
RAISE NOTICE '老板;请少加点工资';
END IF;
END;
$$ LANGUAGE PLPGSQL;

调用测试

lottu=# SELECT if_test(7399);
NOTICE: 该员工不存在! lottu=# SELECT if_test(7369);
NOTICE: 老板;请多加点工资 lottu=# SELECT if_test(7566);
NOTICE: 老板;请少加点工资

1.2 CASE条件语句

-- 
CREATE OR REPLACE FUNCTION case_test1(x NUMERIC)
RETURNS void
AS $$
DECLARE
msg text;
BEGIN
CASE x
WHEN 1, 2 THEN
msg := 'one or two';
ELSE
msg := 'other value than one or two';
END CASE;
RAISE NOTICE 'look it, it is %' ,msg;
END;
$$ LANGUAGE PLPGSQL; CREATE OR REPLACE FUNCTION case_test2(x NUMERIC)
RETURNS void
AS $$
DECLARE
msg text;
BEGIN
-- msg := CASE WHEN x in (1,2) THEN 'one or two' ELSE 'other value than one or two' END;
CASE
WHEN x in (1,2) THEN
msg := ''one or two'';
ELSE
msg := 'other value than one or two';
END CASE;
RAISE NOTICE 'look it, it is %' ,msg;
END;
$$ LANGUAGE PLPGSQL;

2.循环

2.1 简单循环

[ <<label>> ]
LOOP
statements
EXIT [ label ] [ WHEN boolean-expression ];
END LOOP [ label ];
  • LOOP定义一个无条件的循环,无限循环,直到由EXIT或RETURN语句终止。
  • 可选的label可以由EXIT和CONTINUE语句使用,用于在嵌套循环中声明应该应用于哪一层循环。
  • 如果声明了WHEN,循环退出只有在boolean-expression为真的时候才发生, 否则控制会落到EXIT后面的语句上。

案例1:输出一个1-10的列表

CREATE OR REPLACE FUNCTION LOOP_TEST_01()
RETURNS void
AS $$
DECLARE
n numeric := 0;
BEGIN
LOOP
n := n + 1;
RAISE NOTICE 'n 的当前值为: %',n;
EXIT WHEN n >= 10;
END LOOP;
END;
$$ LANGUAGE PLPGSQL;

2.2 WHILE 循环

语法:

WHILE boolean-expression LOOP
statements;
END LOOP;

只要条件表达式(boolean-expression)为真,WHILE语句就会不停的在一系列语句上进行循环, 条件是在每次进入循环体的时候检查的。

CREATE OR REPLACE FUNCTION LOOP_TEST_02()
RETURNS void
AS $$
DECLARE
n numeric := 0;
BEGIN
WHILE n < 10 LOOP
n := n + 1;
RAISE NOTICE 'n 的当前值为: %',n;
END LOOP;
END;
$$ LANGUAGE PLPGSQL;

2.3. FOR (integer variant)

语法:

FOR name IN [ REVERSE ] expression .. expression [ BY expression ] LOOP
statements
END LOOP [ label ];

每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环。

FOR i IN 1..10 LOOP
-- i will take on the values 1,2,3,4,5,6,7,8,9,10 within the loop
END LOOP; FOR i IN REVERSE 10..1 LOOP
-- i will take on the values 10,9,8,7,6,5,4,3,2,1 within the loop
END LOOP; FOR i IN REVERSE 10..1 BY 2 LOOP
-- i will take on the values 10,8,6,4,2 within the loop
END LOOP;

2.4 for遍历命令结果

语法:

FOR target IN query LOOP
statements
END LOOP [ label ];

这种在实际工作过程中;由于需要用到游标,经常用它来替换游标。

在这里注意到是:i变量必须要声明为RECORD; 这在oracle的存储过程没这个设置。

CREATE OR REPLACE FUNCTION LOOP_TEST_03()
RETURNS void
AS $$
DECLARE
i RECORD;
BEGIN
FOR i IN select ename,job from emp where deptno = 20 loop
RAISE NOTICE '% job is %', i.ename ,i.job;
end loop;
END;
$$ LANGUAGE PLPGSQL;

2.5 CONTINUE语句

语法:

CONTINUE [ label ] [ WHEN boolean-expression ];

CONTINUE可以用于所有类型的循环;它并不仅仅限于无条件循环,不会跳出循环。

CREATE OR REPLACE FUNCTION LOOP_TEST_04()
RETURNS void
AS $$
DECLARE
n numeric := 0;
BEGIN
WHILE n < 10 LOOP
n := n + 1;
CONTINUE WHEN n = 5;
RAISE NOTICE 'n 的当前值为: %',n;
END LOOP;
END;
$$ LANGUAGE PLPGSQL;

2.6 EXIT语句

语法:

EXIT [ label ] [ WHEN boolean-expression ];

EXIT可以用于在所有的循环类型中,它并不仅仅限制于在无条件循环中使用。 会跳出循环。

CREATE OR REPLACE FUNCTION LOOP_TEST_05()
RETURNS void
AS $$
DECLARE
n numeric := 0;
BEGIN
WHILE n < 10 LOOP
n := n + 1;
EXIT WHEN n = 5;
RAISE NOTICE 'n 的当前值为: %',n;
END LOOP;
END;
$$ LANGUAGE PLPGSQL;

PostgreSQL存储过程(3)-流程控制语句的更多相关文章

  1. MYSQL存储过程中-流程控制语句

    存储过程中常用的流程控制 复习下存储过程内部的语法 定义存储过程体的局部变量: 定义方法:DECLARE a INT DEFAULT 100或者DECLARE   a INT ; SET a=100; ...

  2. 流程控制语句(MySQL/MariaDB )

    本文目录:1.BEGIN...END2.true和false3.if结构4.case结构5.loop.leave和iterate6.repeat循环7.while循环 MySQL/MariaDB中的符 ...

  3. Sql Server 流程控制语句

    T-SQL中用来编写流程控制模块的语句有:BEGIN...AND语句.IF...ELSE语句.CASE语句.WHILE语句.GOTO语句.BREAK语句.WAITFOR语句和RETURN语句. 批处理 ...

  4. MS SQL 流程控制语句

    Declare   myCursor   cursor   For     Select   *   from   table1         open   myCursor         Fet ...

  5. Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...

  6. MySQL全面瓦解20:可编程性之流程控制语句

    背景 说到流程控制语句,我们在程序语法中用的比较多,比如C#的if..else...,while...,?: 等.同样的,在MySQL中,也有一些流程控制的语法,方便我们在写函数.存储过程的时候对逻辑 ...

  7. Linux Shell 流程控制语句

    * 本文主要介绍一些Linux Shell 常用的流程控制语句* 1. if 条件语句:if-then/if-elif-fi/if- else-fi if [条件判断逻辑1];then command ...

  8. 8-04流程控制语句BEGIN ..END

     流程控制语句: 是用来控制程序流程的语句. 常用的流程控制语句的分类: 顺序结构:BEGIN...END 分支结构: IF ..ELSE 或CASE ..END 循环结构:WHILE 顺序结构 语法 ...

  9. JAVA 1.6 流程控制语句

    1. 条件运算符(三元表达式),其形式为:type d = a ? b : c; 具体化形式为:int d = 2 < 1 ? 3 : 4;2. 轻量级的文本编辑器:UltraEdit.Edit ...

随机推荐

  1. windows调试工具列表

    摘自windbg帮助文档(windbg中输入.hh): Debugging Tools for Windows (安装WinDbg后这些工具都会安装在目录C:\Program Files (x86)\ ...

  2. webpack 多页应用架构系列实战

    阅读目录 1.webpack配置了解 2.webpack CommonsChunkPlugin公共代码剥离 3.了解ProvidePlugin的用途 回到顶部 1.webpack配置了解 webpac ...

  3. 读Zepto源码之Callbacks模块

    Callbacks 模块并不是必备的模块,其作用是管理回调函数,为 Defferred 模块提供支持,Defferred 模块又为 Ajax 模块的 promise 风格提供支持,接下来很快就会分析到 ...

  4. 走进json

    纯做笔记,请多指教... 1,json格式: 非数组: {"key" : "value"} 数组:[{"key" : "value ...

  5. (转)目前比较全的CSS重设(reset)方法总结

    在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览器都能够理解和适用多有CSS规则,并且呈现相同的视 ...

  6. 【JAVASCRIPT】React学习-JSX 语法

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 JSX 语法 1. 定义 JSX 是javascript + xml 的合集,我们可以将javascript 与 ht ...

  7. web组件工具之获取表单数据:webUtils

    本文需要的架包:commons-beanutils-1.8.3.jar.commons-logging-1.1.3.jar.servlet-api.jar. 本文共分为五部分:1)封装通用工具类:从表 ...

  8. 百度地图JavaScript API使用

    最近在完成优达学城前端开发(入门)课程的P4项目中,要求调用google地图进行交互,项目已提供部分js代码和html代码.但在申请google地图API密钥时由于网络等原因,打不开或者连接超时,所以 ...

  9. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  10. 微信小程序-滚动消息通知

    写在前面: 微信小程序学的不太多,做了一个简单的项目,回来很快时间内把在深圳两天的房租给赚回来了. 这次我主要想总结一下微信小程序实现上下滚动消息提醒,主要是利用swiper组件来实现,swiper组 ...