postgresql从入门到菜鸟(四)pl/pgsql过程语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/s465689853/article/details/81066934

之前介绍了一些postgresql数据库的配置,以及窗口函数的使用。

这一次准备说一些pl/pgsql过程语言方面的东西。

pl/pgsql主要的功能是对sql进行扩展,让sql可以实现,逻辑判断,循环等功能。

首先说说优点,我个人理解使用过程语言最大的优点就是减少了客户端与服务端之间的通信消耗。

以一个用户登录的功能为例:

假设登录功能实现的方式为,首先判断用户是否存在,如果不存在,向用户返回用户不存在的消息,如果用户存在,再进行用户名密码是否匹配的判断。

这时用户登录就分为的两种情况

场景1.客户端访问服务端判断用户是否存在(发生第一次通信连接),用户不存在,返回客户端相应消息。

场景2.客户端访问服务端判断用户是否存在(发生第一次通信连接),用户存在,判断用户名密码是否匹配(发生第二次通信连接),判断后返回相应消息。

在场景2中,共发生了两次通信,那么有没有办法使这个业务在一次通信中就完成呢,这个时候过程语言就派上了用场。

先看看基本语法:

create or replace function 函数名(参数类型)returns 返回类型 as $$
declare:
定义参数
参数名 参数类型 :=参数初始值;
begin
方法体
return 参数类型;
end;$$
language plpgsql STABLE SECURITY DEFINER;

然后再看需求(一个登陆验证函数):
函数名:userlogin_check()
参数:uname varchar,pwd varchar
功能:先判断用户是否存在,存在的场合再判断密码是否正确
返回值:result int

有了以上条件似乎写一个验证函数似乎也不那么难

create or replace function userlogin_check(uname varchar,pwd varchar) returns int as $$
declare -- 变量申明
 _uname varchar;
 _passwd varchar;
 _result int := -100; 
BEGIN -- 开始
    SELECT password INTO _passwd
    FROM users
    WHERE username = uname;  -- 根据用户名查询密码
    if found then -- 如果查询到数据,说明用户存在,判断密码正确性
        if _passwd = pwd then
            _result := 0; -- 成功登录
        else
            _result := -2; -- 用户名密码不匹配
        end if;
    else --如果没有查询到数据,说明用户不存在
        _result := -1; -- 用户不存在
    end if;
    return _result;
EXCEPTION WHEN OTHERS THEN --异常处理
    raise notice 'exception in userlogin_check: %, %', SQLSTATE, SQLERRM;

    return  _result;
END; --结束
$$
LANGUAGE plpgsql STABLE SECURITY DEFINER;

将以上内容保存为.sql文件后在psql命令中通过/i导入,或者直接在psql命令执行以上内容后即可通过select userlogin_check(‘smoon’,’1234’);方式调用,并根据返回值判断登录结果。

通过这种方式在场景2可以减少一次通信连接,在更加复杂的业务中则可以减少的则更多。

猜你喜欢

转载自blog.csdn.net/s465689853/article/details/81066934