09 函数和存储过程

文章目录

    • 函数和存储过程
      • 函数创建
      • 存储过程创建
      • 存储过程和存储函数操作
      • 函数和存储过程区别

函数和存储过程

存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,调用存储过程和函数可以简化应用开发工作,提高数据处理的效率。

函数创建

delimiter 自定义符号  create function 函数名(形参列表) returns 返回类型  -- 注意是retruns
begin函数体   -- 若干sql语句,但是不要直接写查询return val;
end  自定义符号delimiter ;释义:
delimiter 自定义符号 是为了在函数内些语句方便,制定除了;之外的符号作为函数书写结束标志,一般用$$或者//
形参列表 : 形参名 类型   类型为mysql支持类型
返回类型:  函数返回的数据类型,mysql支持类型即可
函数体: 若干sql语句组成
return: 返回指定类型返回值
e.g. 
-- 如果函数中有写操作则函数不能放在where语句中使用
create function st() returns int
beginupdate class set sex='m' where name="tonny";return (select score from class where name='Tonny');
end $$create function st1() returns int
beginreturn (select score from class where name='Tonny');
end $$--局部变量 : 获得最高分和最低分分数差
create function st2() returns int
begindeclare num_1 int;declare num_2 int;set num_1=(select score from class order by score desc limit 1);select score from class order by score limit 1 into num_2;return num_1-num_2;
end $$
e.g. 含有参数的函数调用
delimiter $$
create function queryNameById(uid int) returns varchar(20)
begin
return  (select name from class where id=uid);
end $$
delimiter ;select queryNameById(1)
  • 设置变量
    • 定义用户变量 : set @[变量名] = 值;使用时用@[变量名]。
    • 定义局部变量 : 在函数内部设置 declare [变量名] [变量类型]; 局部变量可以使用set赋值或者使用into关键字。
books表完成 ,编写一个函数,传入两本书的名字,得到两本书的价格之差create function get_price(book1 varchar(30),book2 varchar(30))
returns float
begindeclare price1 float;declare price2 float;select price from books where bname=book1 into price1;select price from books where bname=book2 into price2;return price1-price2;
end $$

存储过程创建

创建存储过程语法与创建函数基本相同,但是没有返回值。

delimiter 自定义符号 create procedure 存储过程名(形参列表)
begin存储过程    -- sql语句构成存储过程语句集
end  自定义符号delimiter ;释义:
delimiter 自定义符号 是为了在函数内些语句方便,制定除了;之外的符号作为函数书写结束标志
形参列表 :[ IN | OUT | INOUT ] 形参名 类型in 输入,out  输出,inout 可以输入也可以输出
存储过程: 若干sql语句组成,如果只有一条语句也可以不写delimiterbegin,end
e.g. 存储过程创建和调用
create procedure st()
begindelete from class where name="James";update class set score=71 where name="Emma";select * from class;
end $$call st();
  • 存储过程三个参数的区别

    • IN 类型参数可以接收变量也可以接收常量,传入的参数在存储过程内部使用即可,但是在存储过程内部的修改无法传递到外部。

    • OUT 类型参数只能接收一个变量,接收的变量不能够在存储过程内部使用(内部为NULL),但是可以在存储过程内对这个变量进行修改。因为定义的变量是全局的,所以外部可以获取这个修改后的值。

    • INOUT类型参数同样只能接收一个变量,但是这个变量可以在存储过程内部使用。在存储过程内部的修改也会传递到外部。

e.g. : 分别将参数类型改为IN OUT INOUT 看一下结果区别
delimiter $$
create procedure p_out ( OUT num int )
beginselect num;set num=100;select num;
end $$
delimiter ;set @num=10;
call p_out(@num)
books表,使用存储过程完成,将2020年以前出版的图书价格增加3元,参数传入一个作家的名字,将该作家的图书,在此基础上再涨2元,按照图书价格打印出图书信息,只要书名,作者和价格即可create procedure get_books(in aname varchar(30))
beginupdate books set price=price+3 where p_time<"2020-01-01";update books set price=price+2 where author=aname;select bname,author,price from books order by price;
end $$

存储过程和存储函数操作

  1. 调用存储过程

语法:

call 存储过程名字([存储过程的参数[,……]])
  1. 调用存储函数

语法:

select 存储函数名字([函数的参数[,……]])
  1. 使用show create语句查看存储过程和函数的定义

语法:

show create  {procedure|function}  存储过程或存储函数的名称
  1. 查看所有函数或者存储过程
select name,type from mysql.proc where db='stu';
show procedure|function status  where db="stu";
  1. 删除存储过程或存储函数

语法:

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

函数和存储过程区别

  1. 函数有且只有一个返回值,而存储过程不能有返回值。
  2. 函数只能有普通参数,而存储过程可以有in,out,inout多个类型参数。
  3. 存储过程中的语句功能更丰富,实现更复杂的业务逻辑,可以理解为一个按照预定步骤调用的执行过程,而函数中不能展示查询结果集语句,只是完成查询的工作后返回一个结果,功能针对性比较强。
  4. 存储过程一般是作为一个独立的部分来执行(call调用)。而函数可以作为查询语句的一个部分来调用。

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

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

相关文章

人工智能|机器学习——k-近邻算法(KNN分类算法)

1.简介 k-最近邻算法&#xff0c;也称为 kNN 或 k-NN&#xff0c;是一种非参数、有监督的学习分类器&#xff0c;它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题&#xff0c;但它通常用作分类算法&#xff0c;假设可以在彼此附近找到相似点。 对于分类…

五个与iOS基础开发相关的案例:

iOS是由苹果公司开发的移动操作系统&#xff0c;专为iPhone、iPad和iPod touch等设备设计。iOS系统以其流畅的用户体验、丰富的功能和强大的安全性而著称&#xff0c;成为全球最受欢迎的移动操作系统之一。iOS基础开发则是构建在这些设备上的应用程序的过程&#xff0c;涉及多个…

JavaScript—— 运算符总结(超全)

JavaScript—— 运算符总结(超全) 1.小括号运算符 ​ ()在我们js执行代码的过程中&#xff0c;一行代码内&#xff0c;优先执行小括号里面的内容; 2. 自增和自减运算符&#xff08;一元运算符&#xff09; 自增&#xff1a;让当前变量1的意思 let num 2 num // 3 num // …

Linux shell 列举当前所有网卡的IPV4地址及网卡名。

命令一&#xff1a; ip -4 addr show | grep inet | awk { printf "%s ", $2; for (i5; i<NF; i) { printf "%s ", $i }; printf "\n" } | awk {print $1, $NF} 命令二&#xff1a; 忽略 lo 环路网卡 ip -4 addr show | grep inet | awk …

标志寄存器

文章目录 标志寄存器是什么ZF标志PF标志SF标志CF标志OF标志adc指令sbb指令cmp指令有条件的转移指令DF标志和串传送指令pushf和popf 标志寄存器是什么 在8086CPU中标志寄存器是一个特殊的寄存器&#xff0c;具有以下3中功能&#xff1a; 1.用来存储相关指令的某些执行结果 2.用…

.SVN 信息泄露漏洞原理以及修复方法

漏洞名称&#xff1a;.SVN信息泄露、版本管理工具文件信息泄漏 漏洞描述&#xff1a;据介绍&#xff0c;SVN&#xff08;subversion&#xff09;是程序员常用的源代码版本管理软件。一旦网站出现SVN 漏洞&#xff0c;其危害远比SQL注入等其它常见网站漏洞更为致命&#xff0c;…

餐饮行业新风口:社区店的成功案例与经营秘诀

在竞争激烈的餐饮行业中&#xff0c;社区店正成为一个新的风口。作为一名90后的鲜奶吧创业者&#xff0c;我在社区开店已经5年时间&#xff0c;下面我将分享一些成功的社区店案例&#xff0c;并揭示其经营秘诀。 1、案例一&#xff1a;特色小吃店 这家小吃店以地方特色美食为…

MySQL安装与卸载

安装 1). 双击官方下来的安装包文件 2). 根据安装提示进行安装(全部默认就可以) 安装MySQL的相关组件&#xff0c;这个过程可能需要耗时几分钟&#xff0c;耐心等待。 输入MySQL中root用户的密码,一定记得记住该密码 配置 安装好MySQL之后&#xff0c;还需要配置环境变量&am…

平台总线--ID匹配和设备树匹配

一、ID匹配之框架代码 id匹配&#xff08;可想象成八字匹配&#xff09;&#xff1a;一个驱动可以对应多个设备 ------优先级次低 注意事项&#xff1a; device模块中&#xff0c;id的name成员必须与struct platform_device中的name成员内容一致&#xff0c;因此device模块中…

数据结构与算法-插值查找

引言 在计算机科学的广阔天地中&#xff0c;数据结构和算法扮演着至关重要的角色。它们优化了信息处理的方式&#xff0c;使得我们在面对海量数据时能够高效、准确地进行检索与分析。本文将聚焦于一种基于有序数组且利用元素分布规律的查找算法——插值查找&#xff08;Interpo…

C++面向对象程序设计-北京大学-郭炜【课程笔记(五)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;五&#xff09;】 1、常量对象、常量成员函数1.1、常量对象1.2、常量成员函数1.3、常引用 2、友元&#xff08;friends&#xff09;2.1、友元函数2.2、友元类 3、运算符重载的基本概念3.1、运算符重载 4、赋值运算符的重…

二维码门楼牌管理系统应用场景:推动旅游与文化产业的智慧化升级

文章目录 前言一、二维码门楼牌管理系统在旅游领域的应用二、二维码门楼牌管理系统在文化产业的应用三、结语 前言 随着信息技术的不断发展&#xff0c;二维码门楼牌管理系统作为一种创新的信息化手段&#xff0c;正在逐渐渗透到旅游和文化领域。它通过为文化景点、旅游景点和…

ARM系统控制和管理接口System Control and Management Interface

本文档描述了一个可扩展的独立于操作系统的软件接口,用于执行各种系统控制和管理任务,包括电源和性能管理。 本文档描述了系统控制和管理接口(SCMI),它是一组操作系统无关的软件接口,用于系统管理。SCMI 是可扩展的,目前提供了以下接口: • 支持的接口的发现和自描述…

Java Map接口实现类之 HashMap

定义 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable{static final int DEFAULT_INITIAL_CAPACITY 1 << 4; //默认初始化容积&#xff0c;就是默认数组的长度为 16static final int MAXIMUM_CAP…

keep-alive 页面切换不触发onActivated和onDeactivated方法周期

<keep-alive :include"tagList"><component :is"Component" /></keep-alive>const tagList computed(() > {return $store.state.tagList })原因&#xff1a; store.state.app.tagList返回的是一个 Proxy&#xff0c; 代理了数组&am…

openxml获取xlsx的Excel.Validation

在 Open XML SDK 中&#xff0c;无法直接使用 Excel.Range 和 Excel.Validation&#xff0c;因为这是 VSTO (Visual Studio Tools for Office) 的概念&#xff0c;而不是 Open XML SDK 的概念。Open XML SDK 提供了对 Office Open XML (OOXML) 文件格式的低级访问&#xff0c;而…

Docker上部署LPG(loki+promtail+grafana)踩坑复盘

Docker上部署LPG&#xff08;lokipromtailgrafana&#xff09;踩坑复盘 声明网上配置部署踩坑 声明 参考掘金文章&#xff1a;https://juejin.cn/post/7008424451704356872 版本高的用docker compose命令&#xff0c;版本低的用docker-compose 按照文章描述&#xff0c;主要准备…

Windows下PostgreSQL安装教程

一、下载 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

自动化测试框架有哪些?

前言 自动化测试常用的Python框架有哪些&#xff1f;常用的框架有Robot Framework、Pytest、UnitTest/PyUnit、Behave、Lettuce。Pytest、Robot Framework和UnitTest主要用于功能与单元测试&#xff0c;Lettuce和Behave仅适用于行为驱动测试。 一、Robot Framework Python测…

ASE 2023 Paper

1 CertPri: Certifiable Prioritization for Deep Neural Networks via Movement Cost in Feature Space. &#xff08;CertPri&#xff1a;通过特征空间中的移动成本对深度神经网络进行可认证的优先级排序。&#xff09; 2 Nuances are the Key: Unlocking ChatGPT to Find F…