暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

postgresql function 中的流程控制一(判断)

最帅dba工作笔记 2021-04-22
1488

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论