wang-liang-blogs

虽工作多年,但是sql的存储过程一致都没怎么用过,今天来按照博客https://www.cnblogs.com/applelife/p/11016674.html来学习一下(我使用postgre sql将这篇文章的例子都跑一遍)。

新建一张students表:

create table students(
    id int primary key,
    age int,
    name varchar(20),
    city varchar(20)
);

insert into students values(1, 22, \'赵四\', \'杭州\');
insert into students values(2, 16, \'刘能\', \'上海\');
insert into students values(3, 20, \'谢广坤\', \'深圳\');
insert into students values(4, 21, \'刘美兰\', \'北京\');
insert into students values(5, 20, \'宋晓峰\', \'湖北\');
insert into students values(6, 21, \'谢大脚\', \'江苏\');
insert into students values(7, 20, \'苏玉红\', \'天津\');
insert into students values(8, 21, \'陈艳兰\', \'云南\');

数据如图:

 

1.不带参数的存储过程

create or replace function getAllCount() returns integer as $$ 
declare
 rlt_str varchar;
begin
    select into rlt_str count(*) from students;
    return rlt_str;
end
$$
language plpgsql;

然后执行这个存储过程:

select getAllCount();

注意:这个写法和mysql的差别还蛮大的;存储过程必须先执行一次,然后在随时的调用。

2.带参数的存储过程

drop function queryById(id int4, out s_name text, out s_city text);

create or replace function queryById(id int4, out s_name text, out s_city text)
returns setof record  as
$$ 
declare
 rec record;
begin
    for rec in execute \'select * from students where id = \'||$1 loop
        s_name := rec.name;
        s_city := rec.city;
        return next;
    end loop;
end;
$$
language plpgsql;

select * from queryById(1);

执行结果:

注意:这样查询记录还需要一个一个赋值;$1表示的是第一个参数; ||表示的字符串的拼接;record表示的是一条记录。

修改这个存储过程,查询出多个结果,这个时候是这样的。

create or replace function queryById(id int4, out s_name text, out s_city text)
returns setof record  as
$$ 
declare
 rec record;
begin
    for rec in execute \'select * from students where age = \'||$1 loop
        s_name := rec.name;
        s_city := rec.city;
        return next;
    end loop;
end;
$$
language plpgsql;

调用

select * from queryById(20);

执行结果:

 总结:

pgsql的存储过程的一般写法:

CREATE OR REPLACE FUNCTION 函数名(参数名 参数类型,...)
RETURNS 返回值类型 AS
$BODY$
DECLARE
变量声明
BEGIN
函数体
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE;

贴几个写法示例的博客:https://www.cnblogs.com/kuang17/p/8143814.html

分类:

技术点:

相关文章: