博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL存储过程(3)-流程控制语句
阅读量:6614 次
发布时间:2019-06-24

本文共 6633 字,大约阅读时间需要 22 分钟。

流程控制

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

本次环境会用到表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);
View Code

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_listEND IF;-----------------------IF search_condition THEN    statement_listELSE    statement_listEND IF;-----------------------IF search_condition THEN    statement_listELSIF search_condition THEN    statement_listELSE    statement_listEND IF;

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

CREATE OR REPLACE FUNCTION if_test(vc_empno NUMERIC)RETURNS voidAS $$DECLAREvn_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 voidAS $$DECLAREmsg 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 voidAS $$DECLAREmsg 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 简单循环

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

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

CREATE OR REPLACE FUNCTION LOOP_TEST_01()RETURNS voidAS $$DECLAREn 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 voidAS $$DECLAREn 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    statementsEND 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 loopEND 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 loopEND LOOP;FOR i IN REVERSE 10..1 BY 2 LOOP    -- i will take on the values 10,8,6,4,2 within the loopEND LOOP;

2.4 for遍历命令结果

语法:

FOR target IN query LOOP    statementsEND LOOP [ label ];

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

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

CREATE OR REPLACE FUNCTION LOOP_TEST_03()RETURNS voidAS $$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 voidAS $$DECLAREn 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 voidAS $$DECLAREn numeric := 0;BEGIN    WHILE n < 10 LOOP       n := n + 1;       EXIT WHEN n = 5;       RAISE NOTICE 'n 的当前值为: %',n;  END LOOP;END;$$ LANGUAGE PLPGSQL;

 

转载于:https://www.cnblogs.com/lottu/p/7405829.html

你可能感兴趣的文章
Azure SQL Database (19) Stretch Database 概览
查看>>
VBA概述之在Office产品中创建自己的应用程序
查看>>
在C#中使用属性控件添加属性窗口
查看>>
linux内核驱动中对字符串的操作【转】
查看>>
delegate引用参数示例
查看>>
printf()详解之终极无惑
查看>>
交叉检验---训练数据,验证数据和测试数据
查看>>
Emacs中多个golang项目的配置方法
查看>>
Linux下的Backlight子系统(一)【转】
查看>>
AspNetPager分页控件配置
查看>>
【Android开发坑系列】之Fragment
查看>>
c++ 注册表的设置立即生效
查看>>
sql日期转换
查看>>
linux资源限制函数getrlimit,setrlimit(转载)【转】
查看>>
linux下热插拔事件的产生是怎样通知到用户空间,kobject_uevent_env之uevent【转】...
查看>>
备胎的养成记KeepAlived实现热备负载
查看>>
Android -- Scroller
查看>>
[XAML学习资料] XAML 概述一
查看>>
Amazon RDS的通用型存储(SSD)
查看>>
发现并防止托管代码中出现内存泄漏
查看>>