首页 > 数据库 >【PostgreSQL】提高篇——如何创建和使用自定义函数和存储过程,包括 PL/pgSQL 语言的使用

【PostgreSQL】提高篇——如何创建和使用自定义函数和存储过程,包括 PL/pgSQL 语言的使用

时间:2024-10-01 13:24:22浏览次数:10  
标签:salary 存储 PostgreSQL name 自定义 employees pgSQL emp total

数据库管理中,存储过程和自定义函数是非常重要的概念,尤其是在使用 PostgreSQL 这样的关系数据库管理系统时。它们允许开发者将复杂的业务逻辑封装在数据库中,从而提高应用程序的性能、可维护性和安全性。

使用 PL/pgSQL 语言编写的存储过程和函数可以实现数据处理、事务控制和复杂计算等功能。

一、背景与重要性

  1. 性能优化:通过将业务逻辑移到数据库服务器,减少了应用程序与数据库之间的通信,从而提高了性能。存储过程在服务器端执行,减少了网络延迟。

  2. 封装与重用:将常用的业务逻辑封装为存储过程或函数,便于在不同的应用程序中重用,降低了代码重复。

  3. 安全性:可以通过存储过程和函数控制用户对数据的访问,避免直接操作表,增强了数据的安全性。

  4. 复杂计算:在数据处理时,存储过程和函数可以执行复杂的计算和数据转换,适合处理大批量数据。

二、PL/pgSQL 语言简介

PL/pgSQL 是 PostgreSQL 的过程式语言,扩展了 SQL 的功能,支持变量、控制结构(如条件语句和循环)、异常处理等。它非常适合用于编写存储过程和函数。

三、创建和使用自定义函数

1. 创建简单的自定义函数

示例:创建一个计算两数之和的函数。

CREATE OR REPLACE FUNCTION add_numbers(a INTEGER, b INTEGER)
RETURNS INTEGER AS $$
BEGIN
    RETURN a + b;
END;
$$ LANGUAGE plpgsql;

解释

  • CREATE OR REPLACE FUNCTION:创建或替换一个函数。
  • add_numbers(a INTEGER, b INTEGER):函数名为 add_numbers,接受两个整数参数 a 和 b
  • RETURNS INTEGER:指定函数返回一个整数。
  • AS $$ ... $$:定义函数体,使用 BEGIN 和 END 包围逻辑。
  • RETURN a + b;:返回参数 a 和 b 的和。
  • LANGUAGE plpgsql:指定使用 PL/pgSQL 语言。
2. 调用自定义函数
SELECT add_numbers(5, 10);

结果:返回 15

四、创建和使用存储过程

1. 创建简单的存储过程

示例:创建一个存储过程,向一个表中插入数据。

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    salary NUMERIC
);

CREATE OR REPLACE PROCEDURE insert_employee(emp_name VARCHAR, emp_salary NUMERIC)
AS $$
BEGIN
    INSERT INTO employees (name, salary) VALUES (emp_name, emp_salary);
END;
$$ LANGUAGE plpgsql;

解释

  • CREATE TABLE employees:创建一个名为 employees 的表,包含 idname 和 salary 字段。
  • CREATE OR REPLACE PROCEDURE:创建或替换一个存储过程。
  • insert_employee(emp_name VARCHAR, emp_salary NUMERIC):存储过程名为 insert_employee,接受两个参数:员工姓名和薪水。
  • INSERT INTO employees ...:将参数插入到 employees 表中。
2. 调用存储过程
CALL insert_employee('Alice', 50000);
CALL insert_employee('Bob', 60000);

结果:在 employees 表中插入了两条记录。

五、使用控制结构和异常处理

1. 使用控制结构

示例:创建一个存储过程,计算并返回员工的薪水总和。

CREATE OR REPLACE PROCEDURE calculate_total_salary(OUT total_salary NUMERIC)
AS $$
BEGIN
    SELECT SUM(salary) INTO total_salary FROM employees;
END;
$$ LANGUAGE plpgsql;

解释

  • OUT total_salary NUMERIC:定义一个输出参数 total_salary
  • SELECT SUM(salary) INTO total_salary:计算 employees 表中所有员工的薪水总和,并将结果存入 total_salary
2. 调用存储过程并获取输出
CALL calculate_total_salary(total_salary);

结果:输出参数 total_salary 包含所有员工的薪水总和。

六、异常处理示例

示例:创建一个存储过程,处理插入时的异常。

CREATE OR REPLACE PROCEDURE safe_insert_employee(emp_name VARCHAR, emp_salary NUMERIC)
AS $$
BEGIN
    INSERT INTO employees (name, salary) VALUES (emp_name, emp_salary);
EXCEPTION
    WHEN unique_violation THEN
        RAISE NOTICE 'Employee % already exists!', emp_name;
END;
$$ LANGUAGE plpgsql;

解释

  • EXCEPTION 块用于捕获异常。
  • WHEN unique_violation:当插入的员工姓名已存在时,捕获唯一性违反异常。
  • RAISE NOTICE:输出警告信息,通知用户。

七、总结

自定义函数和存储过程在 PostgreSQL 中提供了强大的功能,能够有效地封装业务逻辑、提高性能和安全性。

通过 PL/pgSQL 语言,开发者可以实现复杂的逻辑控制、异常处理和数据操作。掌握这些概念后,开发者可以在实际项目中更好地管理和操作数据,提升应用程序的整体质量和效率。

标签:salary,存储,PostgreSQL,name,自定义,employees,pgSQL,emp,total
From: https://blog.csdn.net/thinking_chou/article/details/142651882

相关文章

  • postgresql僵尸进程的处理思路
    简介僵尸进程(zombieprocess)是指一个已经终止但仍然在进程表中保留条目的进程。正常情况下,当一个进程完成执行并退出时,操作系统会通过父进程调用的wait()或waitpid()系统调用来收集该子进程的退出状态。如果父进程未及时调用这些函数,子进程的状态信息就无法从内核中移除,导致进程在......
  • PbootCMS默认面包屑导航样式修改及自定义的设置方法
    在使用PbootCMS建站时,如果你需要对系统默认的面包屑标签(Breadcrumb)样式进行修改,可以通过自定义标签参数来实现。下面详细介绍如何进行这些自定义操作。面包屑调用示例默认的面包屑调用方式如下:twig {pboot:position}自定义面包屑参数你可以使用以下参数来自定义面包......
  • 自定义类型:结构体,枚举,联合
    文章目录结构体**结构体声明****结构体的基础知识**结构体变量的定义和初始化结构体内存对齐修改默认对齐数百度笔试题:结构体传参位段什么是位段位段的内存分配3.2剩余空间利用的问题位段的跨平台问题总结:位段的应用枚举枚举类型的定义枚举的优点枚举的使用联合(共......
  • Winform控件优化之自定义控件的本质【从圆角控件看自定义的本质,Region区域无法反锯齿
    自定义控件的本质自定义控件的本质只有两点:重绘控件Region区域(圆角、多边形、图片等),这是整个控件的真实范围。缺点是Region无法抗锯齿,自定义的Region范围是有锯齿的,无法消除;此外新的Region还会和绘制的背景产生1像素的白边(在圆角或图形拐角部分),且几乎无法有效的消除。【后......
  • Qt项目中,在main.cpp中定义了一个自定义组件,但是在编译的时候报错`undefined reference
    1、问题描述我在测试Qt项目的main.cpp中编写了如下代码:classMyWidget1:publicQWidget{Q_OBJECT};//main程序入口argc命令行变量的数量argv命令行变量的数组intmain(intargc,char*argv[]){//应用程序对象,在Qt中应用程序对象有且仅有一个QAppl......
  • PbootCMS默认面包屑导航样式修改及自定义的设置方法
    在使用PbootCMS建站时,如果需要对系统默认的面包屑(breadcrumb)标签样式进行修改,可以通过自定义参数来实现。下面详细介绍如何使用 {pboot:position} 标签,并自定义相关的参数。自定义面包屑标签基本语法{pboot:position}[position:breadcrumb]{/pboot:position}......
  • 象形闽都 数智榕城 | PostgreSQL中文社区技术沙龙 - 福州站
    在数字化浪潮席卷的时代,数据已成为推动社会进步与企业发展的核心动力。福建,作为东南沿海的经济与文化重镇,正以崭新的姿态拥抱数智未来。为促进福建地区数据库技术的交流与发展,我们诚挚邀请您参加“象行闽都,数智榕城——PostgreSQL数据库技术沙龙”。 活动主题:象行闽都、数智......
  • 用自定义函数镶嵌求解某年某月的天数
    首先分析年份年份分为1.平年2.闰年对于闰年的定义为可以被4整除并且不被100整除,或者可以被400整除部分代码如下​if((y%4==0&&y%100!=0)||y%400==0)//if判断年份是否是闰年​ 月份的判断一年有12个月,1~12个月中天数不同,其中可以用数组来表示自定......
  • ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)
    ASP.NETWebApiOWIN实现OAuth2.0(自定义获取Token) 相关文章:ASP.NETWebApiOWIN实现OAuth2.0之前的项目实现,Token放在请求头的Headers里面,类似于这样:Accept:application/jsonContent-Type:application/jsonAuthorization:BearerpADKsjwMv927u...虽然这是......
  • PostgreSQL是否有等待事件
    PostgreSQL是否有等待事件PostgreSQL提供了等待事件(WaitEvents)的机制,用于监控数据库运行过程中因资源争用而导致的等待情况。这些等待事件可以帮助数据库管理员识别导致性能问题的瓶颈,例如锁冲突、I/O等待等。什么是等待事件?等待事件是指PostgreSQL中的进程在等待某......