SQL存储过程的学习01

  • 格式:pdf
  • 大小:89.43 KB
  • 文档页数:2

SQL存储过程的学习01

虽⼯作多年,但是sql的存储过程⼀致都没怎么⽤过,今天来按照博客来学习⼀下(我使⽤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;

贴⼏个写法⽰例的博客: