PostgreSQL – 存储过程简介
PostgreSQL 允许用户借助用户定义的函数和存储过程,通过各种过程语言元素(通常称为存储过程)来扩展数据库功能。
存储过程定义用于创建触发器或自定义聚合函数的函数。此外,存储过程还增加了许多过程特征,例如控制结构和复杂计算。这些使您可以更轻松、更有效地开发自定义功能。
可以使用DO命令调用程序代码块,而无需定义函数或存储过程。
PostgreSQL将过程语言分为两大类:
- 任何用户都可以使用安全语言。 SQL 和 PL/pgSQL 是安全的语言。
- 沙盒语言仅由超级用户使用,因为沙盒语言提供绕过安全性并允许访问外部资源的能力。 C 是沙盒语言的一个例子。
默认情况下,PostgreSQL 支持三种过程语言:SQL、PL/pgSQL 和 C。您还可以使用扩展将其他过程语言(例如 Perl、 Python和 TCL)加载到 PostgreSQL 中。
使用 PostgreSQL 存储过程的优点:
存储过程带来了许多优点,如下所示:
- 减少应用程序和数据库服务器之间的往返次数。所有 SQL 语句都包含在存储在 PostgreSQL 数据库服务器中的函数中,因此应用程序只需发出函数调用即可获取结果,而不是发送多个 SQL 语句并在每次调用之间等待结果。
- 提高应用程序性能,因为用户定义的函数和存储过程预先编译并存储在 PostgreSQL 数据库服务器中。
- 可在许多应用中重复使用。一旦你开发了一个函数,你就可以在任何应用程序中重用它。
使用 PostgreSQL 存储过程的缺点:
除了使用存储过程的优点外,还有一些注意事项:
- 软件开发缓慢,因为存储过程编程需要许多开发人员不具备的专业技能。
- 版本管理难,调试难。
- 可能无法移植到其他数据库管理系统,例如 MySQL 或 Microsoft SQL Server。
例子:
我们将使用以下帐户表进行演示:
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('Raju', 10000);
insert into accounts(name, balance)
values('Nikhil', 10000);
以下查询将显示表数据:
select * from accounts;
结果如下图所示:
以下查询创建一个名为transfer的存储过程,用于将指定金额的资金从一个帐户转移到另一个帐户。
create or replace procedure transfer(
sender int,
receiver int,
amount dec
)
language plpgsql
as $$
begin
-- subtracting the amount from the sender's account
update accounts
set balance = balance - amount
where id = sender;
-- adding the amount to the receiver's account
update accounts
set balance = balance + amount
where id = receiver;
commit;
end;$$
调用存储过程
要调用存储过程,请使用CALL语句,如下所示:
call stored_procedure_name(argument_list);
例子:
以下语句调用transfer存储过程将$1, 000从 Raju 的帐户转移到 Nikhil 的帐户:
call transfer(1, 2, 1000);
以下语句验证转账后accounts表中的数据:
SELECT * FROM accounts;
输出: