存储过程

142
2023/08/02 09:59:56

本章我们将讨论存储过程。

创建存储过程

使用 CREATE PROCEDURE 语句创建存储过程,语法如下:

  • 存储过程的参数模式只能是 ININOUT,而不能是OUT
  • 存储过程不能返回值
    • 即不能使用 RETURN 表达式;
    • 但可以使用不带表达式的 RETURN; 来停止存储过程
    • 如要从存储过程中返回值,可以使用 INOUT 模式的参数

示例数据:

drop table if exists accounts;

create table accounts (
    id int generated by default as identity,
    name varchar(100) not null,
    balance dec(15,2) not null,
    primary key(id)
);

insert into accounts(name,balance)
values('Bob',10000);

insert into accounts(name,balance)
values('Alice',10000);

以下示例用于将指定金额从一个账户转账到另一个账户:

create or replace procedure transfer(
   sender int,
   receiver int, 
   amount dec
)
language plpgsql    
as $$
begin
    -- 从转账人账户里扣除金额
    update accounts 
    set balance = balance - amount 
    where id = sender;

    -- 给收款人账号增加金额
    update accounts 
    set balance = balance + amount 
    where id = receiver;

    commit;
end $$;

调用存储过程:

call transfer(1,2,1000);

删除存储过程

drop procedure [if exists] procedure_name [(argument_list)]
[cascade | restrict]

删除存储过程与删除函数非常相似,包括如果发生重载,需要通过参数列表来显式指定要删除的重载版本。