PostgreSQL的函数和存储过程
xsobi 2024-12-01 05:36 11 浏览
简介
PostgreSQL是最流行的对象关系型数据库系统。它是一个强大的、高性能的数据库系统。在这篇文章中,我们将讨论如何使用函数和存储过程来执行操作,如插入、删除、更新和查询。感兴趣的同学可以通过 MemFireDB一边操作一边阅读。
函数
一般来说,函数是一组进行任何操作的SQL语句,如选择、插入、删除和更新。在PostgreSQL中有两种类型的函数 "系统定义的函数 "和 "用户定义的函数"。在这篇文章中,我们讨论用户定义的函数。
函数语法
CREATE OR REPLACE FUNCTION function_name (parameters-list)
RETURNS return_type
LANGUAGE plpgsql
AS
$
DECLARE
--- variables
BEGIN
--- SQL statements (logic)
END
$
优势
你可以在一个函数中拥有多个SQL语句,你可以返回任何类型的结果,如一个表或一个单一的值(整数,varchar,日期,时间戳,等等)。
限制
你不能在函数中使用事务。
存储过程
为了克服函数的限制,PostgreSQL提供了存储过程来支持事务。在存储过程中,我们可以启动、提交、回滚事务。然而,存储过程不能像表一样返回一个结果集。它只能返回INOUT参数。
语法
CREATE OR REPLACE PROCEDURE procedure_name (parameters-list)
LANGUAGE plpgsql
AS
$
DECLARE
--- Variables
BEGIN
--- SQL statements (logic)
END
$
创建数据库
我们这里使用 memfiredb.com 登录之后点击创建数据库,输入相应的信息就可以完成数据库的创建了:
创建完数据库后,下载一个推荐的客户端,参照教程连接数据库。https://community.memfiredb.com/topic/47/%E5%A6%82%E4%BD%95%E4%B8%8B%E8%BD%BDwindows%E5%AE%A2%E6%88%B7%E7%AB%AF-dbeaver
建表
让我们使用以下SQL脚本在testdb数据库中创建Employees表:
CREATE TABLE Employees
(
Id serial,
Name VARCHAR(100),
DateOfBirth Date,
City VARCHAR(100),
Designation VARCHAR(100),
JoiningDate Date
)
存储过程创建及使用
参数类型
在创建存储过程和函数之前,让我们先看一下参数的类型,有三种类型的参数,我们可以在函数和存储过程中使用。
- IN
- OUT
- INOUT
IN
IN代表一个输入参数。它用于在函数或存储过程中传递数值,如果我们不在参数名称后面使用IN关键字,默认情况下所有的参数都是输入类型。
OUT
OUT代表输出类型的参数。它返回值;你可以把它作为空值传递,也可以不初始化,因为这些类型的参数只用于从函数和存储过程中设置和返回值。
INOUT
INOUT代表输入和输出类型的参数,这些类型的参数可以用来传递值,也可以从一个函数或存储过程中返回值。
创建存储过程
使用下面的脚本来创建一个名为 "AddEmployee "的存储过程。这将在Employees表中插入信息。
CREATE OR REPLACE PROCEDURE AddEmployee
(
EmpId INOUT INT,
EmpName VARCHAR(100),
EmpDob DATE,
EmpCity VARCHAR(100),
EmpDesignation VARCHAR(100),
EmpJoiningDate DATE
)
LANGUAGE plpgsql AS
$
BEGIN
INSERT INTO Employees (Name,DateOfBirth,City,Designation,JoiningDate) VALUES
(EmpName,
EmpDob,
EmpCity,
EmpDesignation,
EmpJoiningDate
) RETURNING Id INTO EmpId;
END
$;
然后执行一下该存储过程,将信息插入到Employees表中:
CALL AddEmployee(null,'Peter Parker','1997-10-01','New York' ,'Web Developer','2020-11-01');
然后我们执行命令,检查一下是否有数据插入到表中:
SELECT * FROM Employees;
接下来我们将创建一个存储过程来更新Employees记录:
CREATE OR REPLACE PROCEDURE UpdateEmployee
(
EmpId INT,
EmpName VARCHAR(100),
EmpDob DATE,
EmpCity VARCHAR(100),
EmpDesignation VARCHAR(100),
EmpJoiningDate DATE
)
LANGUAGE plpgsql AS
$
BEGIN
UPDATE Employees SET
Name = EmpName,
DateOfBirth = EmpDob,
City = EmpCity,
Designation = EmpDesignation,
JoiningDate = EmpJoiningDate
Where Id = EmpId;
END
$;
我们试着执行一下:
CALL UpdateEmployee(1,'Peter S Parker','1999-10-01','New York' ,'Web Developer','2020-11-01');
我们已经创建了能执行插入和更新的存储过程,现在我们将创建一个存储过程,使我们能够删除Employees中的记录。
CREATE OR REPLACE PROCEDURE DeleteEmployee
(
EmpId INT
)
LANGUAGE plpgsql AS
$
BEGIN
DELETE FROM Employees WHERE Id = EmpId;
END
$;
执行该存储过程:
CALL DeleteEmployee(2);
会删除id是2的记录。上面我们演示了如何使用存储过程,接下来我们将演示如何创建和使用函数。
函数创建及使用
先看一个简单的例子:
CREATE OR REPLACE FUNCTION GetAllEmployees()
RETURNS Employees
LANGUAGE SQL
AS
$
SELECT * FROM Employees;
$;
然后我们试着执行下面的语句:
SELECT * FROM GetAllEmployees();
上面的select语句会从GetAllEmployees函数的返回结果中进行查询。下面是一个可以接受输入参数的例子:
CREATE OR REPLACE FUNCTION GetEmployeeById(EmpId INT)
RETURNS Employees
LANGUAGE SQL
AS
$
SELECT * FROM Employees WHERE Id = EmpId;
$;
执行:
SELECT * FROM GetEmployeeById(3);
再看一个例子,我们正Employees表中有一个出生日期字段,所以让我们创建一个函数来根据出生日期返回年龄。这里用到了一个系统内置的age函数来计算年龄,它接受两个参数:当前日期和出生日期。它通过计算差值来返回年龄。
CREATE OR REPLACE FUNCTION GetEmployeeAge(EmpId INT, Age OUT VARCHAR(100))
LANGUAGE plpgsql
AS
$
BEGIN
SELECT AGE(NOW()::Date,DateOfBirth) into Age FROM Employees WHERE Id = EmpId;
END;
$
上面定义的GetEmployeeAge函数包含两个参数,其中EmpId是int类型的输入参数,Age则是varchar类型的输出参数,所以,该函数的调用方法如下:
SELECT * FROM GetEmployeeAge(1);
总结
当我们需要返回单值结果或表格式结果时,函数是一个很好的选择。如果你想启动一个事务,提交或回滚多个SQL语句,那么存储过程是最佳选择。
相关推荐
- 我把家搬进了NAS?家庭资产数字化革命,现在连袜子都有编号了!
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙家里东西一多,总有一种“我记得我有这个,但我不知道放哪了”的错觉。...
- Mega Run第3关通关攻略-跳上高空(mega运动)
-
错过火炮等于失败,这是MegaRun在上一关中给玩家的一点小挑战,那在后面的关卡中,这中挑战会给你造成什么困难呢?具体请看MegaRun第3关通关攻略-跳上高空。MegaRun第3关在一开始我...
- Axure高保真教程:中继器表格自动合计模板
-
编辑导语:合计作为日常使用频率比较高的一个功能,但在Axure里面传统的表格如果做合计是很麻烦的,遇到数据多的时候很耗费时间,那么该如何优化,提高工作效率?本文以中继器表格为核心,教大家如何制作一个自...
- 多角色登录原型(分角色登录)
-
编辑导读:多角色登录是很多系统都需要具备的功能,例如在招聘网站里,登录的角色包括、求职者、招聘企业的hr、猎头、内部员工等等。本文作者分享了如何在Axure里面制作多角色登录的原型模板,希望对你有帮助...
- 利用Axure+js创建可配置地图页面(axure地址选择)
-
编辑导语:如何利用Axure实现自定义地图展示?本篇文章里,作者结合Axure与高德地图,对如何在Axure中设置相应参数、进而预览时实现自定义地图展示效果的操作流程进行了示范和总结,一起来看一下。本...
- 纬地智能模板的一些基础与概念(纬地智能模板的一些基础与概念是什么)
-
对于公路及相关土木工程的勘测设计工作,虽然基础的理论和方法是基本相同的,但是受到各国家、地区文化、制图习惯等方面因素的影响,不同地域公路勘测设计的习惯和表达方式有着很大的差异,当然语言方面的不同和差...
- WPF界面开发第三方控件入门指南——菜单项
-
点击“了解更多”获取工具DevExpressWPFSubscription拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强...
- 鸿蒙开发:自定义一个搜索模版(鸿蒙系统怎么添加百度搜索条)
-
前言代码案例基于Api13。...
- 简单介绍一下前端各框架中的模板标签
-
在各大前端框架、小程序中,此类标签的作用主要是用来帮助我们包裹多个元素。在浏览器实际渲染中会将其移除只渲染其包裹的DOM元素,所以说不会增加额外的DOM节点...
- 法媒:简单的几个步骤让你的运动鞋更加炫酷
-
【环球网综合报道】有没有觉得自己的运动鞋样式单调,希望它变得更加炫酷?法媒《ELLE》推荐了一种简单易行的装饰方法,让您的运动鞋更加时尚。制作前,您需要准备一张细毡子、一张闪光热胶合布、胶水、两个银夹...
- Blazor 代码隐藏(blazor 操作dom)
-
Razor组件通常是在单个.razor文件中创作的,这样就存在页面中包含html代码和后台代码(@code标记指定的代码)。如下...
- DevExpress WPF入门指南:DXBars, DXRibbon中使用MVVM的两种方式
-
你也可以下载Universal安装包或者到DevExpress中文网查看更多示例和教程哦本文档介绍在DXBars,DXRibbon和GalleryControl这三个控件中使用MVVM框架的...
- 干货,Uploadfive插件上传,Python接收存储
-
在Web开发工作中,经常遇到上传需求,上传照片,文件等,网上的上传插件有很多,我使用的是一款H5上传插件Uploadfive,与之对应的是Uploadify,后者是基于Flash的,不过现在越来越多的...
- 用DevExpress实现基于HTML&CSS的桌面应用程序的UI(二)
-
DevExpressWinForm拥有180+组件和UI库,能为WindowsForms...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- characterencodingfilter (33)
- getmonth (34)
- label换行 (33)
- android studio 3 0 (34)
- html转js (35)
- 索引的作用 (33)
- checkedlistbox (34)
- xmlhttp (35)
- mysql更改密码 (34)
- 权限777 (33)
- htmlposition (33)
- 学校网站模板 (34)
- textarea换行 (34)
- 轮播 (34)
- asp net三层架构 (38)
- bash (34)