存储过程和函数的区别

news2024/11/24 18:34:28

目录

零、基本格式

一、返回值

二、参数传递

1、存储过程

2、函数

三、执行方式

四、事务处理

1、存储过程

2、函数

五、数据库兼容性


课上老师提出的讨论题:存储过程和函数的区别?

有同学回复:在数据库后端编程中,存储过程和函数都是用来封装一段可重复使用的代码逻辑,以便在需要时进行调用。

它们的主要区别在于:

  1. 返回值:函数必须返回一个值,可以是一个标量值或一个表值,而存储过程不需要返回值,只需要执行一些操作。
  2. 参数传递:函数和存储过程都可以接受参数,但是函数的参数只能是输入参数,而存储过程可以有输入参数、输出参数和输入输出参数。
  3. 执行方式:函数可以像普通的SQL语句一样直接调用执行,而存储过程需要用CALL或EXECUTE语句来调用执行。
  4. 事务处理:存储过程可以控制事务处理,可以在存储过程内部开启、提交或回滚事务,而函数无法控制事务。
  5. 数据库兼容性:函数在不同的数据库系统之间具有更好的兼容性,而存储过程在不同的数据库系统之间可能存在差异。

在零部分之后我们将对这段话进行验证,但仅针对于 PostgreSQL15 数据库。

零、基本格式

函数的基本格式:

create function func()
returns void as $$
    begin
        
    end;
$$
language plpgsql;

存储过程的基本格式:

create procedure pro()
as $$
    begin
        
    end;
$$
language plpgsql;

运行结果如下图所示:

显然我们会认为存储过程和函数是两个玩意儿,但是 PostgreSQL15 仍然不允许存储过程和函数的 “函数类型” 相同,函数类型包括:函数名和参数类型,否则出现下述报错:

ERROR: 错误:  带相同参数类型的函数 "func" 已经存在

SQL 状态: 42723

 

 

一、返回值

验证成立:

  • 函数必须要有一个返回值,可以是一个标量值或一个表值
  • 存储过程不能有返回值

不满足上述条件则会报错。

二、参数传递

验证失败,第二句话错误:

  • 函数和存储过程都可以接受参数 √
  • 函数的参数只能是输入参数 × => 可以是输入参数和输出参数
  • 存储过程的参数可以是输入参数和输出参数 √

默认为输入参数,具有 OUT 关键字的是输出参数。

1、存储过程

create or replace procedure test(a integer, out b integer)
as $$
    begin
        b := a * 2;
    end;
$$
language plpgsql;

调用方法:

call test(5, 0);

看起来是不是很离谱,似乎输出参数也可以填一个字段,但是我不知道格式是啥。

2、函数

create or replace function testf(a integer, out b integer)
returns integer as $$
    begin
        b := a * 2;
    end;
$$
language plpgsql;

注意点一:返回值由 OUT 参数决定

-- 只有一个OUT参数时,返回值类型应与该参数一致
create or replace function testf(a integer, out b integer)
returns integer as $$

-- 具有多个OUT参数时,返回值类型应为record型
create or replace function testf(a integer, out b integer, out c integer)
returns record as $$

注意点二:函数的调用,显然这个传参方式比存储过程合理多了

select testf(5);
select * from testf(5);

 

三、执行方式

验证失败,第二句话存疑:

  • 函数可以像普通的 SQL 语句一样直接调用执行 √
  • 存储过程需要用 CALL 或 EXECUTE 语句来调用执行 ×
  • => 存储过程使用 CALL 语句来调用执行

不满足上述条件则会报错。没见过用 EXECUTE 语句来调用的例子。

四、事务处理

验证成功:

  • 函数无法控制事务
  • 存储过程能够控制事务:开启、提交或回滚事务

但是好像不需要用 begin; 开启事务了,因为本来就有一个 begin

1、存储过程

create procedure test()
as $$
    begin
        update score set grade=0;
		rollback;
        commit;
    end;
$$
language plpgsql;

2、函数

create function testf()
returns void as $$
    begin
        update score set grade=0;
		-- rollback;
        commit;
    end;
$$
language plpgsql;

不管是执行 rollback 还是 commit,都会出现报错,以下是 commit 的报错信息:

ERROR: 错误: 无效交易终止
CONTEXT: 在COMMIT的第4行的PL/pgSQL函数testf()

五、数据库兼容性

待验证:

  • 函数在不同的数据库系统之间具有更好的兼容性
  • 存储过程在不同的数据库系统之间可能存在差异

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python数据攻略-Pandas的数据创建与基础特性

大家好,我是Mr数据杨!今天将进入Python的Pandas数据世界,就像三国演义中的英雄们,用聪明才智塑造自己的命运。 记得三国中,周瑜曾利用兵法巧妙策划火烧赤壁,击败曹军。这就像创建一个Pandas DataFrame&…

布局量子计算工业应用!D-Wave正在“偷偷”干大事

​ (图片来源:网络) D-Wave 致力于让用户从量子计算中即时受益,而不必等到长远的未来。几十年来,这家加拿大公司一直努力将设备商业化,多家企业客户都在使用其量子计算来优化业务运营。例如,Pay…

Spark RDD容错机制

文章目录 一、RDD容错机制(一)血统方式(二)设置检查点方式 二、RDD检查点(一)RDD检查点机制(二)与RDD持久化的区别(三)RDD检查点案例演示 三、共享变量&#…

mysql数据库出现Too many connections以及磁盘满了的查看方式

Too many connections问题 这问题是数据库连接数太多了导致的, 两个排查方向 1、当用户数量大的时候 先查看最大连接数show variables like ‘%max_connections%’; 这里的最大连接数就是2000,够用了,一般500-1000就够了,内存多…

【干货分享】3D模型可视化、格式转换引擎和Parasolid如何集成?

​今天分享一个示例项目,该示例项目使用HOOPS链轮将HOOPS Exchange和Siemens Parasolid实施到HOOPS Visualize中。 HOOPS中文网http://techsoft3d.evget.com/↓ 点击下方视频查看详情 ↓ HOOPS Visualize - Exchange和Parasolid集成视频 正如您在上面的视频中看到…

小白必看:零基础入门网络安全

1、什么是网络安全? 官方的回答:指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。 具有保密性、完整性、可用性、可控性…

chatgpt赋能python:Python如何分成两栏写入Word文档

Python如何分成两栏写入Word文档 在进行文本排版时,有些时候我们需要将文字分成两栏来排版,这样可以让文章更加美观,易读。 本文将介绍一种使用Python将文本分成两栏写入Word文档的方法。在介绍具体实现方法之前,我们先来了解一…

【SLAM】ROS平台下三种自主探索算法总结

目录 前言 一、frontier_exploration 二、explorate_lite 三、rrt_exploration 总结 前言 探索是指当机器人处于一个完全未知或部分已知环境中,通过一定的方法,在合理的时间内,尽可能多的获得周围环境的完整信息和自身的精确定位&#…

自动化测试支持

自动化测试支持 自动化测试是现代软件开发中不可或缺的一环。它可以帮助开发团队快速、精确地检测软件中的缺陷,提高软件质量和开发效率。 自动化测试可以在代码变更频繁、测试用例数庞大时,显著地减少测试时间和工作量。相对于手动测试,自动…

集权设施攻防兵法:实战攻防之堡垒机篇

一、黑客视角下的堡垒机 堡垒机是一种网络安全设备,用于保护和管理企业内部网络与外部网络之间的访问。它作为一种中间节点,提供安全的访问控制和审计功能,用于保护内部网络免受未经授权的访问和攻击。堡垒机通常被用作跳板服务器&#xff0…

计算机网络实验:RIP路由协议配置

目录 前言实验目的实验内容相关知识点实验设备实验过程总结 前言 计算机网络是指由多台计算机通过通信设备和通信线路互联起来,实现信息交换的系统。计算机网络中的路由器是一种专用的网络设备,它负责根据目的地址选择最佳的传输路径,将数据…

容器(第二篇)docker网络

Docker 网络实现原理: Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为…

6月6日汇报

1. 张量CP分解 三阶张量的CP分解是将其分解为三个矩阵。例如:一个三阶张量 ,则CP分解可以写为 其中, 表示向量外积, 。下图为三阶张量的CP分解: 将上面的CP分解展开,也可以写为: 假设有一个三维…

LS1028/LS1043/LS1046+FPGA+TSN多路时间敏感性网络智能工业网关方案

随着 物联网、大数据、人工智能等技术的快速发展与应用,给传统的云计算模式带来了巨大的挑战,这也催生出了计算模式的变革, 边缘计算由此诞生。 所谓边缘计算,是指在靠近物或数据源头的一侧,采用网络、计算、存储、应用…

From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了

上期主要分享了 From Java To Kotlin 1 :空安全、扩展、函数、Lambda。 这是 From Java to Kotlin 第二期。 带来 表达式思维、子类型化、类型系统、泛型。 From Java to Kotlin 关键在于 思维的转变。 表达式思维 Kotlin 中大部分语句是表达式。 表达式思维是一…

Vue.js 中的数据请求是什么?如何进行数据请求?

Vue.js 中的数据请求是什么?如何进行数据请求? Vue.js 是一款流行的前端框架,它提供了许多方便的工具和 API,用于构建交互式的用户界面。其中,数据请求是 Vue.js 中重要的一部分,它可以让我们从服务器获取…

通过python封装商品ID采集1688商品详情数据,1688商品详情接口,1688API接口

1688是阿里巴巴集团旗下的B2B电商平台,提供海量的商品和服务。通过1688的API接口可以获取到商品的详细数据,并进行采集和分析。 1688的商品详情接口包括以下信息: 商品名称商品图片商品价格商品库存商品属性商品描述商品评价商品销量商品SK…

什么蓝牙耳机通话效果好,介绍几款不错的骨传导耳机

骨传导耳机是一种新型的耳机,相比于传统的耳机,骨传导耳机听歌时不需要将耳朵堵上,不会因为长时间佩戴而对听力造成损害。它不需要入耳也能听到声音,在户外运动时能够及时听到环境音,避免安全隐患。现在在骨传导市面上…

从零开始学习JavaScript:轻松掌握编程语言的核心技能⑤

从零开始学习JavaScript:轻松掌握编程语言的核心技能⑤ 1. JavaScript 函数定义2. JavaScript 函数参数2.1 函数显式参数(Parameters)与隐式参数(Arguments)2.1.1 显式参数(Parameters)2.1.2 隐式参数(Arguments) 2.2 …

HVV的艺术系列 之 上线的艺术

上线的艺术 很多时候,拿下的机器情况复杂多样。判断其出网性应该是首要工作。 01 到底该不该上线 承认的是,MSF和CS都是及其出色的后渗透工具。但是面对这种复杂多样的环境,上不上线是个我们要去认真考虑的问题,CS和MSF究竟能给我…