当前位置: 首页 > news >正文

创建简单的 PL/pgSQL 存储过程

文章目录

    • 创建简单的 PL/pgSQL 存储过程
        • CREATE OR REPLACE FUNCTION
        • add_two_numbers(a integer, b integer)
        • RETURNS integer
        • AS`$$ ... $$`
        • 函数体
        • LANGUAGE plpgsql
    • 创建带有 IN 和 OUT 参数的存储过程
    • 创建修改数据的存储过程
    • 创建带有异常处理的复杂存储过程

在 PostgreSQL 中,创建存储过程可以通过使用 CREATE FUNCTION 语句来实现。PostgreSQL 支持多种语言编写存储过程,包括 SQL、PL/pgSQL(Procedural Language/PostgreSQL)、PL/Python、PL/Perl 等。其中,PL/pgSQL 是最常用的内置过程语言。

创建简单的 PL/pgSQL 存储过程

假设我们想要创建一个存储过程,它接受两个整数作为输入参数,并返回它们的和。

-- 创建存储过程
CREATE OR REPLACE FUNCTION add_two_numbers(a integer, b integer)
RETURNS integer AS $$
BEGINRETURN a + b;
END;
$$ LANGUAGE plpgsql;-- 调用存储过程
SELECT add_two_numbers(3, 5);
CREATE OR REPLACE FUNCTION
  • CREATE:这是用来创建新对象的关键字。
  • OR REPLACE:如果已经存在同名的函数,OR REPLACE 会先删除旧的函数再创建新的。这在修改已有函数时非常有用,因为它避免了需要手动删除再创建的麻烦,并且可以在不中断服务的情况下更新函数逻辑。
add_two_numbers(a integer, b integer)
  • add_two_numbers:这是你给函数起的名字。你可以根据函数的功能为它取任何合法的名字。
  • (a integer, b integer):这部分定义了函数的参数列表。在这个例子中,函数有两个参数,分别是 a 和 b,并且它们的数据类型都是 integer(整数)。
RETURNS integer
  • RETURNS:指定函数将返回的数据类型。在这个例子中,函数返回的是一个 integer 类型的结果,即两个输入整数相加后的结果。
AS$$ ... $$
  • AS $$ 和后面的 $$:这两个符号标志着函数体的开始和结束。使用双美元符号($$)作为分隔符可以避免与 SQL 语句中的单引号冲突。当然,你也可以使用其他字符或字符串作为分隔符,例如 $$$BODY$ 等。
函数体
BEGINRETURN a + b;
END;
  • BEGIN ... END;:这一对关键字包围着 PL/pgSQL 代码块。PL/pgSQL 是 PostgreSQL 的过程化语言,允许你在数据库中编写更复杂的逻辑。
  • RETURN a + b;:这是函数体内的一条语句,表示返回两个参数 a 和 b 相加的结果。
LANGUAGE plpgsql

LANGUAGE:指定函数使用的编程语言。在这个例子中,plpgsql 表示使用的是 PostgreSQL 的内置过程化语言 PL/pgSQL。如果你使用的是另一种语言(如 SQL、PL/Python、PL/Perl),则应相应地更改这里的值。

创建带有 IN 和 OUT 参数的存储过程

如果你需要一个存储过程能够输出多个值,可以使用 OUT 参数。

-- 创建存储过程
CREATE OR REPLACE FUNCTION get_min_max(in_nums integer[])
RETURNS TABLE(min_val integer, max_val integer) AS $$
BEGINRETURN QUERY SELECT MIN(val), MAX(val) FROM unnest(in_nums) AS val;
END;
$$ LANGUAGE plpgsql;-- 调用存储过程
SELECT * FROM get_min_max(ARRAY[1, 2, 3, 4, 5]);

创建修改数据的存储过程

这里展示如何创建一个存储过程,该过程插入一条记录到表中。

-- 假设有一个名为 users 的表
CREATE TABLE IF NOT EXISTS users (id serial PRIMARY KEY,name text NOT NULL,age integer NOT NULL
);-- 创建存储过程
CREATE OR REPLACE PROCEDURE insert_user(user_name text, user_age integer)
LANGUAGE plpgsql
AS $$
BEGININSERT INTO users (name, age) VALUES (user_name, user_age);
END;
$$;-- 调用存储过程
CALL insert_user('Alice', 30);

请注意,从 PostgreSQL 11 开始,正式支持了 CREATE PROCEDURE 语法,用于创建不返回结果集的过程。在此之前版本中,你只能使用 CREATE FUNCTION 来创建过程,即使这些函数实际上并不返回任何有意义的值。

创建带有异常处理的复杂存储过程

对于更复杂的逻辑,你可以添加异常处理来增强程序的健壮性。

-- 创建存储过程
CREATE OR REPLACE PROCEDURE update_user(id integer, new_name text, new_age integer)
LANGUAGE plpgsql
AS $$
BEGINUPDATE usersSET name = new_name, age = new_ageWHERE users.id = id;IF NOT FOUND THENRAISE EXCEPTION 'User with ID % not found.', id;END IF;EXCEPTIONWHEN others THENRAISE NOTICE 'An error occurred: %', SQLERRM;-- 可以选择在此处记录日志或采取其他措施
END;
$$;-- 调用存储过程
CALL update_user(1, 'Bob', 28);

注意事项

  • 权限:确保创建存储过程的用户有足够的权限。
  • 事务管理:存储过程中的所有操作都在同一个事务中执行。如果过程中有任何错误发生,整个事务将被回滚。
  • 调试:可以在存储过程中使用 RAISE NOTICE 或 RAISE WARNING 来输出调试信息。
  • 性能考虑:尽量避免在存储过程中进行大量的行级操作,因为这可能会导致性能问题。

相关文章:

创建简单的 PL/pgSQL 存储过程

文章目录 创建简单的 PL/pgSQL 存储过程CREATE OR REPLACE FUNCTIONadd_two_numbers(a integer, b integer)RETURNS integerAS$$ ... $$函数体LANGUAGE plpgsql 创建带有 IN 和 OUT 参数的存储过程创建修改数据的存储过程创建带有异常处理的复杂存储过程 在 PostgreSQL 中&…...

Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速,租房市场日益繁荣&a…...

Node.js实现WebSocket教程

Node.js实现WebSocket教程 1. WebSocket简介 WebSocket是一种在单个TCP连接上提供全双工通信的协议,允许服务器和客户端之间进行实时、双向通信。本教程将详细讲解如何在Node.js中实现WebSocket。 2. 技术选型 我们将使用ws库来实现WebSocket服务器,…...

Docker Compose实战一( 轻松部署 Nginx)

通过过前面的文章(Docker Compose基础语法)你已经掌握基本语法和常用指令认识到Docker Compose作为一款强大工具的重要性,它极大地简化了多容器Docker应用程序的部署与管理流程。本文将详细介绍如何使用 Docker Compose 部署 Nginx&#xff0…...

hive分区分桶、数据倾斜总结

一、hive的基本概念 hive是一个构建在hadoop上的数据仓库工具,可以将结构化的数据文件映射为一张数据库表并提供数据查询功能 二、hive的特点 (1)数据是存储在hdfs上 (2)底层是将sql转换为MapReduce任务进行计算 …...

unity打包到安卓帧率降低

这个问题遇到过很多次了我的做法就是直接设置Application.targetFrameRate60 参考...

【Python3】装饰器 自动更新缓存

自动更新缓存的需求场景 在某些应用中,我们可能需要定期从外部数据源(如 Redis 或者远程接口)拉取数据,并将其缓存在内存中。当有其他代码需要访问这些数据时,可以立刻从内存获取最新数据,而无需每次都进行…...

通过EPEL 仓库,在 CentOS 7 上安装 OpenResty

通过EPEL 仓库,在 CentOS 7 上安装 OpenResty 通过EPEL 仓库,在 CentOS 7 上安装 OpenResty步骤 1: 安装 EPEL 仓库步骤 2: 安装 OpenResty步骤 3: 启动 OpenResty步骤 4: 设置开机自启步骤 5: 验证安装说明 通过EPEL 仓库,在 CentOS 7 上安装…...

[RabbitMQ] RabbitMQ常见应用问题

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...

每日速记10道java面试题13-MySQL篇

其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 每日速记10道java面试题03-CSDN博客 每日速记10道java面试题04-CSDN博客 每日速记10道java面试题05-CSDN博客 每日速记10道java面试题06-CSDN博客 每日速记10道java面试题07-CSDN博客 每…...

乐鑫科技嵌入式面试题及参考答案(3万字长文)

嵌入式开发为什么用 C 语言,而不用 C++ 语言? 在嵌入式开发中,C 语言被广泛使用而 C++ 相对少用有以下一些原因。 首先,C 语言具有更高的效率。嵌入式系统通常资源受限,包括处理器速度、内存容量等。C 语言的代码生成效率高,能够生成紧凑的机器码,占用较少的内存空间和处…...

Leetcode 每日一题 56.合并区间

目录 问题描述 示例 示例 1 示例 2 问题分析 算法设计 步骤 1:排序 步骤 2:合并区间 步骤 3:返回结果 过题图片 代码实现 复杂度分析 题目链接 结语 问题描述 给定一个区间数组 intervals,其中每个区间由两个整数 s…...

【Vue】v-model、ref获取DOM

目录 v-moel v-model的原理 v-model用在组件标签上 方式 defineModel()简写 ref属性 获取原生DOM 获取组件实例 nextTick() v-moel v-model:双向数据绑定指令 数据变了,视图跟着变(数据驱动视图)视图变了,数…...

Python 类的设计(以植物大战僵尸为例)

关于类的设计——以植物大战僵尸为例 一、设计类需满足的三要素1. 类名2. 属性和方法 二、以植物大战僵尸的为例的类的设计1. 尝试分类2. 创建对象调用类的属性和方法*【代码二】*3. 僵尸的继承 三、代码实现 一、设计类需满足的三要素 1. 类名 类名:某类事物的名…...

python中权重剪枝,低秩分解,量化技术 代码

目录 python中权重剪枝,低秩分解,量化技术 代码 权重剪枝 低秩分解 scipy 量化技术 python中权重剪枝,低秩分解,量化技术 代码 权重剪枝 权重剪枝可以通过PyTorch的torch.nn.utils.prune模块实现。以下是一个简单的例子: import torch import torch.nn as nn impor…...

调用matlab用户自定义的function函数时,有多个输出变量只输出第一个变量

很多朋友在使用matlab时,会使用或自己编辑多个function函数,来满足自己对任务处理的要求,但是在调用function函数时,会出现这个问题:调用matlab用户自定义的function函数时,有多个输出变量只输出第一个变量…...

RabbitMQ七种工作模式之简单模式, 工作队列模式, 发布订阅模式, 路由模式, 通配符模式

文章目录 一. Simple(简单模式)公共代码:生产者:消费者: 二. Work Queue(工作队列模式)公共代码:生产者:消费者1, 消费者2(代码相同): 三. Publish/Subscribe(发布/订阅模式)公共代码:生产者:消费者: 四. Routing(路由模式)公共代码:消费者: 五. Topics(通配符模式)公共代码:生…...

Win10安装kafka并用C#调用

kafka安装 jdk、kafka版本如下,zookeeper使用kafka自带版本 安装包下载位置:https://download.csdn.net/download/henreash/90087368 (赚点csdn下载资源分) 安装jdk后,解压kafka压缩包,修改配置文件: kafka_2.13-3.9.0\config\…...

高级架构二 Git基础到高级

一 Git仓库的基本概念和流程 什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何…...

深入解析二叉树算法

引言 二叉树(Binary Tree)作为数据结构中的一种重要形式,在计算机科学的诸多领域中得到了广泛应用。从文件系统到表达式解析,再到搜索和排序,二叉树都扮演着关键角色。本文将从二叉树的基础概念出发,详细探讨其各种算法及其应用,并提供相关代码示例,旨在为读者建立扎实…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...