流程控制

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

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

drop table emp;
create table EMP(
EMPNO numeric() not null,
ENAME ),
JOB ),
MGR numeric(),
HIREDATE date,
SAL numeric( ),
COMM numeric( ),
DEPTNO numeric());

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, , );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, , );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, , );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, , );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, ,to_date(, );
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
, , to_date(, );

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  THEN
     RAISE NOTICE '老板;请多加点工资';
    ELSE
     RAISE NOTICE '老板;请少加点工资';
    END IF;
END;
$$ LANGUAGE PLPGSQL;

调用测试

lottu);
NOTICE:  该员工不存在!

lottu);
NOTICE:  老板;请多加点工资

lottu);
NOTICE:  老板;请少加点工资

1.2 CASE条件语句

-- 
CREATE OR REPLACE FUNCTION case_test1(x NUMERIC) RETURNS void AS $$ DECLARE msg text; BEGIN CASE x , 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 ,) 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 :;
BEGIN
  LOOP
    n :;
    RAISE NOTICE 'n 的当前值为: %',n;
    ;
  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 :;
BEGIN
     LOOP
    n :;
    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 退出循环。

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

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

..  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
    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 :;
BEGIN
     LOOP
    n :;
    ;
    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 :;
BEGIN
     LOOP
       n :;
       ;
       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. Linux Shell 流程控制语句

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

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

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

  8. JAVA 1.6 流程控制语句

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

  9. 20151013 C# 第一篇 流程控制语句

    20151013 流程控制语句: 1.选择语句 if … else if...else 选择语句 if(布尔表达式){  语句块:} if(布尔表达式){  语句块1:}else{  语句块2:} i ...

随机推荐

  1. 删除顽固node_modules

    在工作中有用到gulp,webpack,使用他们需用依赖node的一些模块包,于是会在目录下生成一个node_modules文件夹.有一次想删掉它重新生成模块包的时候发现根本不太可能,无穷无尽的报一个 ...

  2. [译]Bundling and Minification

    原文:http://www.asp.net/mvc/overview/performance/bundling-and-minification============================ ...

  3. uboot 2014.04 运行过程记录

    uboot启动流程分析,针对S5PV210 BL1阶段,SPL,u-boot-spl.bin 1.首先运行arch/arm/cpu/armv7/start.S 里面的_start函数,进行异常向量表设 ...

  4. Swift开发UITableView常用的一些细节知识点介绍

    <code class="objectivec"><strong><span style="font-size:18px;"> ...

  5. PIL模块

    处理图片的模块 打开图片 im=Image.open("1.png") 创建字体对象 先要字体文件 font = ImageFont.truetype('C:\\WINDOWS\\ ...

  6. python学习6---排序问题

    1.对列表排序 一维列表: sorted():可用于任何可迭代对象,如数组.列表.字典等. sort():list.sort()返回None,这是因为sort在函数内部修改了list的值,当再次访问l ...

  7. SQL命令入门。

    1.创建数据库:create database  ***: 2.删除数据库:drop database ***: 3.创建数据库的时候设置一些参数选项. create database MyDatab ...

  8. Net开发的部分知名网站案例

    .Net开发的部分知名网站案例:http://www.godaddy.com 全球最大域名注册商http://www.ips.com 环迅支付,国内最早的在线支付平台http://www.icbc.c ...

  9. Arduino入门笔记(3):单LED闪烁

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 在搭建好arduino开发环境(http://www.cnblogs.com/xi ...

  10. HTTP 错误 404.0 - Not Found

    当网上的那些修改程序池的方法,无法解决此问题时,可以尝试修改以下的参数: 1.控制面板-->程序-->启用或关闭Windows功能--> Internet Information S ...