以美元符号作为引号的字符串常量
本章将讨论如何在 PL/pgSQL 编程中使用以美元符号作为引号的字符串常量。块结构
本章将讨论 PL/pgSQL 的块结构,同时也会带你编写第一个 PL/pgSQL 程序。变量
本章将学习 PL/pgSQL 变量的相关知识。行类型
本章将讨论 PL/pgSQL 的行类型。将一个变量声明为行类型之后,它便可以保存数据库中的整行数据。记录类型
本章我们讨论 PostgreSQL 的记录类型,它和行类型相似,也可以存储数据库中的整行信息。常量
本章将讨论 PL/pgSQL 常量。错误和异常处理
本章我们将讨论 PL/pgSQL 的错误和异常处理。控制结构
本章将讨论 PL/pgSQL 的控制结构,包括:IF、CASE、LOOP、WHILE LOOP、FOR LOOP、EXIT和CONTINUE等语句。函数
本章我们将讨论自定义函数的相关知识,包括:创建函数、函数参数的模式、函数重载、返回表的函数以及删除函数等知识。存储过程
本章我们将讨论存储过程。游标
本章我们将讨论 PL/pgSQL 的游标以及如何使用它们逐行处理结果集。触发器
本章将讨论触发器,包括:创建、删除、更新、禁用、启用触发器等知识。
存储过程
- 295
- 2023-08-02 01:59:56
本章我们将讨论存储过程。
上一章我们学习了使用创建自定义函数。函数最大的缺点是,无法执行事务。存储过程解决了这个问题。
创建存储过程
使用 CREATE PROCEDURE
语句创建存储过程,语法如下:
- 存储过程的参数模式只能是
IN
和INOUT
,而不能是OUT
- 存储过程不能返回值
- 即不能使用
RETURN 表达式;
- 但可以使用不带表达式的
RETURN;
来停止存储过程 - 如要从存储过程中返回值,可以使用
INOUT
模式的参数
- 即不能使用
- 即不能使用
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);