流程控制

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

本次环境会用到表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. Linux Shell 流程控制语句

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

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

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

  7. JAVA 1.6 流程控制语句

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

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

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

  9. java基础3_流程控制语句

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

随机推荐

  1. CentOS6.6 kickstart文件

    # Kickstart file automatically generated by anaconda. #version=DEVELinstall#cdromurl --url http://19 ...

  2. js得到屏幕宽高、页面宽高 (window.screen.availHeight)等--笔记

    window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeight 返回当前屏幕高度(空白空间) window.screen.width ...

  3. 窗口类型(Widget, Window, Dialog, Desktop, SubWindow等等)

    http://doc.qt.io/qt-5/qwidget.html#windowFlags-prop http://doc.qt.io/qt-5/qtwidgets-widgets-windowfl ...

  4. 编译器失败,错误代码为xxx

    问题:出现编译器失败,等一会儿出现csc.exe无响应,错误代码不一定是255,是其他的也可以试试 解决办法: 查看是否类似360之类的杀毒软件运行着,如果运行着,关掉然后重新试一下,应该就没有问题了 ...

  5. 设置textview显示框内容不可编辑不可选择。

    f1textview.allowsEditingTextAttributes=NO;////////////设置不可编辑不能用这个,得用下面的一个 textView.editable=NO;//设置可 ...

  6. Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details. ShareSDK 也有这种错误

    Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for ...

  7. spring security 11种过滤器介绍

    1.HttpSessionContextIntegrationFilter 位于过滤器顶端,第一个起作用的过滤器. 用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个Secu ...

  8. MBProgressHUD 问题

    1.MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithWindow:[UIApplication sharedApplication].keyWi ...

  9. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  10. 关于Excel分析图插入到论文的问题

    为了保证插入到latex图片不失真,可将Excel中的图进行如下操作: 1.将Excel分析图另存为.pdf格式: 2.利用Adobe acrobat裁剪掉空白的部分,另存为.eps格式: 3.将ep ...