postgresql function 中的流程控制一(判断)
同其他变成语言一样,plpgsql也遵循流程控制的三要素:顺序,分支,循环
环境需要创建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);
复制
条件判断:
常用的有if和case两种语法
if 有三种形式:
if ... then ... end if;
if ... then ... else ... end if;
if ... then ... else if ... then ... else ... end if;
复制
case 有两种形式:
case ... when ... then ... else ... end case;
case when ... then ... else ... end case;
复制
案例:
当员工工资少于1500的提示出多加工资,当员工工资多于1500的时候,提示少加工资
create or replace function incre_sal_fun(emp_name varchar)
returns void
as $$
declare
emp_sal numeric;
begin
select sal into emp_sal from emp where ename=emp_name;
if emp_sal is null then
raise notice '此员工不是本公司员工';
elseif emp_sal < 1500 then
raise notice '此员工应该多涨工资';
else
raise notice '此员工应该少涨工资';
end if;
end;
$$ language plpgsql;
复制
表中数据
vastbase=# select * from emp;
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+--------+-----------+------+---------------------+------+------+--------
7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800 | | 20
7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600 | 300 | 30
7521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250 | 500 | 30
7566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975 | | 20
7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250 | 1400 | 30
7698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850 | | 30
7782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450 | | 10
7788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000 | | 20
7839 | KING | PRESIDENT | | 1981-11-17 00:00:00 | 5000 | | 10
7844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500 | 0 | 30
7876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100 | | 20
7900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950 | | 30
7902 | FORD | ANALYST | 7566 | 1981-12-02 00:00:00 | 3000 | | 20
7934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300 | | 10
(14 rows)
复制
结果:
vastbase=# select incre_sal_fun('ADAMS');
NOTICE: 此员工应该多涨工资
CONTEXT: referenced column: incre_sal_fun
incre_sal_fun
---------------
(1 row)
vastbase=# select incre_sal_fun('SCOTT');
NOTICE: 此员工应该少涨工资
CONTEXT: referenced column: incre_sal_fun
incre_sal_fun
---------------
(1 row)
vastbase=# select incre_sal_fun('FORD');
NOTICE: 此员工应该少涨工资
CONTEXT: referenced column: incre_sal_fun
incre_sal_fun
---------------
(1 row)
复制
CASE 条件
传入一个参数,判断这个数是不是1,2。
第一种:
case ... when ... else ... end case;
复制
示例:
create or replace function case_fun(x numeric)
returns void as $$
declare
msg varchar;
begin
case x when 1,2 then
msg:='maybe 1 or 2';
else
msg:=' is not 1 or 2';
end case;
raise notice 'the num %',msg;
end;
$$ language plpgsql;
复制
结果:
vastbase=# select case_fun(1);
NOTICE: the num maybe 1 or 2
CONTEXT: referenced column: case_fun
case_fun
----------
(1 row)
vastbase=# select case_fun(3);
NOTICE: the num is not 1 or 2
CONTEXT: referenced column: case_fun
case_fun
----------
(1 row)
复制
第二种:
case when ... else ... end case;
复制
示例:
create or replace function case_fun1(num numeric)
returns void as $$
declare
msg varchar;
begin
case when num in (1,2) then msg :='is 1,2';
else msg :='is not in value';
end case ;
raise notice 'the number %',msg;
end;
$$ language plpgsql;
复制
结果:
vastbase=# select case_fun1(3);
NOTICE: the number is not in value
CONTEXT: referenced column: case_fun1
case_fun1
-----------
(1 row)
vastbase=# select case_fun1(2);
NOTICE: the number is 1,2
CONTEXT: referenced column: case_fun1
case_fun1
-----------
(1 row)
复制
THAT'S ALL
BY CUI PEACE!!!
文章转载自最帅dba工作笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。