<#if settings.post_mathjax!false>

数据库的存储过程

admin
1
2025-11-22

存储过程(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的性能消耗就会更大,存储过程的优势也就能体现出来。

动物装饰