📜  PostgreSQL – 创建过程

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

PostgreSQL – 创建程序

PostgreSQL CREATE PROCEDURE语句顾名思义就是用来创建新的存储过程。到目前为止,您已经学习了如何使用 create 函数语句定义用户定义的函数。

用户定义函数的一个缺点是它们不能执行事务。换句话说,在用户定义的函数,你不能启动一个事务,也不能提交或回滚它。 PostgreSQL 11 引入了支持事务的存储过程。要定义新的存储过程,请使用 create procedure 语句。

下面说明了 create procedure 语句的基本语法:

Syntax:
create [or replace] procedure procedure_name(parameter_list)
language plpgsql
as $$
declare
-- variable declaration
begin
-- stored procedure body
end; $$

我们来分析一下上面的语法:

  • 首先,在create procedure关键字后指定存储过程的名称
  • 其次,为存储过程定义参数。存储过程可以接受零个或多个参数。
  • 第三,指定plpgsql作为存储过程的过程语言。请注意,您可以为存储过程使用其他过程语言,例如 SQL、C 等。
  • 最后,使用美元引用的字符串常量语法来定义存储过程的主体。

存储过程中的参数可以有 in 和inout模式。他们不能有输出模式。存储过程不返回值。您不能像这样在存储过程中使用带有值的 return 语句:



return expression;

但是,您可以使用不带表达式return语句立即停止存储过程:

return;

例子:

我们将使用以下帐户表进行演示:

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;

输出: