存储过程(Stored Procedure)就是把 SQL 语句封装起来,让数据库自己执行。你只需要调用它,不需要每次都写完整 SQL。这有点类似与编程语言里的函数(Function),能写控制语句,例如 IF、WHILE、变量。存储过程是在数据库内部执行,其代码会被预编译。相比于客户端直接传入复杂sql语句,存储过程具有更高的性能。
以 Microsoft SQL Server 为例
假如有一张数据表
create table u_students
(
sid char(10) not null
primary key,
name varchar(16),
cid tinyint
)
现在为它添加一个功能为insert into u_students values ( ... )的存储过程
-- 可以写成 create or alter procedure INSERT_U_STUDENTS 表示如果存在则修改
create procedure INSERT_U_STUDENTS( -- procedure 可以缩写成 proc
@ID_1 char(10),
@NAME_2 varchar(16),
@CLASS_ID_3 tinyint
)
as
insert into u_students(sid,
name,
cid)
values (@ID_1,
@NAME_2,
@CLASS_ID_3)
go; -- mssql要用go作为分割,否则之后的代码可能会被误加载到这个procedure中
如果参数为空,则不写括号
create or alter proc DISPTODAY
as
begin -- begin end 表示 一段代码块,这个示例中 去掉 begin end 也是一样的
select N'今天是'+
datename(year, getdate()) + N'年' +
datename(month, getdate()) + N'月' +
datename(day, getdate()) + N'日' +
datename(weekday , getdate())
as dayinfo
end
go;
调用方法
exec dbo.INSERT_U_STUDENTS
@ID_1 = '5103212106',
@NAME_2 = N'罗辑',
@CLASS_ID_3 = 3;
参数名可以不写
exec dbo.INSERT_U_STUDENTS '5103212106', N'罗辑', 3;
删除,修改procedure, 和修改数据库数 据表一样
alter proc INSERT_U_STUDENTS ...
PL/pgSQL 语法
create or replace function insert_u_students(
p_id char(10),
p_name varchar(16),
p_class_id smallint
)
returns void as $$
begin
insert into u_students (id, name, class_id)
values (p_id, p_name, p_class_id);
end;
$$ language plpgsql;
调用方法
select insert_u_students('5103210101', '张三', 3);
pg11+
call insert_u_students('5103210101', '张三', 3);
这样一个简单的功能体现不出性能,但是如果sql复杂,解释sql的性能消耗就会更大,存储过程的优势也就能体现出来。