📜  PostgreSQL – 存储过程简介

📅  最后修改于: 2022-05-13 01:57:15.446000             🧑  作者: Mango

PostgreSQL – 存储过程简介

PostgreSQL 允许用户借助用户定义的函数和存储过程,通过各种过程语言元素(通常称为存储过程)来扩展数据库功能

存储过程定义用于创建触发器或自定义聚合函数的函数。此外,存储过程还增加了许多过程特征,例如控制结构和复杂计算。这些使您可以更轻松、更有效地开发自定义功能。

可以使用DO命令调用程序代码块,而无需定义函数或存储过程。

PostgreSQL将过程语言分为两大类:

  1. 任何用户都可以使用安全语言。 SQL 和 PL/pgSQL 是安全的语言。
  2. 沙盒语言仅由超级用户使用,因为沙盒语言提供绕过安全性并允许访问外部资源的能力。 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;

输出:

存储过程