什么是存储程序(学废版)

news/2024/11/24 12:38:01/

目录

存储过程

一、无参存储过程:

1、无参存储过程的创建:

        2、存储过程的调用call

3、查看存储过程的基本信息

4、存储过程的删除

5、存储过程的修改

二、带参存储过程

1、调用带参存储过程

2、带参存储过程的使用

3、运用带参存储过程查询数据

4、执行多条语句的存储过程

三、重定义结束符delimiter

delimiter指令的基本使用:

四、存储过程和函数的区别


存储过程


存储过程和函数类似,都是一个事先写好命令并编译后存在数据库中的Mysql语句集合,用于简化开发人员的工作,减少数据在数据库和应用服务器之间的传输,提高处理效率,既然都是函数,那就会有值的传入和传出,其中也存在一些区别
存储过程参数的传递(参数类型)能用In 、out 、inout、并且没有直接的返回值,in 表示数据传入,out表示数据传出,inout表示既可传入又可传出,存储过程内不能使用use切换数据库


函数:参数只能使用in,并且必须要有返回值

一、无参存储过程:


存储过程关键字:procedure
 

创建无参存储过程的基本格式:
create procedure 存储过程名 ()
beginsql语句1;SQL语句2;....sql语句n;
end;

1、无参存储过程的创建:

    -- 创建一个查询学生信息的存储过程
create procedure pro_select_student()select *from db_2.student;-- 存储过程中支持执行部分SQL语句,不支持一些动态SQL语句


        
2、存储过程的调用call


call pro_select_student();

3、查看存储过程的基本信息


show create procedure pro_select_student;

4、存储过程的删除


 

drop procedure 存储过程名;

5、存储过程的修改


-- mysql数据库中、存储过程一旦成功创建,它的功能就不支持修改
-- 如果想要修改一个存储过程的功能,可以删除存储过程后修改功能,在重新创建


二、带参存储过程


 

create procedure 存储过程名(
in[out][inout]参数名1 参数类型1,
in[out][inout]参数名2 参数类型1,....,
in[out][inout]参数名n 参数类型n)
began
sql语句;
end;

1、调用带参存储过程


 

call 存储过程名(参数值1,参数值2,........,参数值n);

2、带参存储过程的使用

-- 创建指定名称查询学生信息的存储过程
create procedure pro_select_student_byname(in sname varchar(20)) -- in:传入类型参数select *from db_2.student where s_name = sname;call peo_select_student_byname("张益达");-- 创建插入学生信息的存储过程
create procedure pro_insert_student(in sname varchar(20)),in scid int,in ssex varchar(4) ,in sage int) -- in:传入类型参数insert into db_2.student values(null,sname,scid,ssex,sage);call pro_insert_student("张三",101,"男",23);

3、运用带参存储过程查询数据

create procedure getstuname(in stu_no int)
begin
select s_name 姓名
from student
where s_no = stu_no;
end;call getstuname(1);

4、执行多条语句的存储过程


 

-- 创建插入学生信息的存储过程,并将刚插入的学生信息查询出来
create procedure pro_insert_student(in sname varchar(20)),in scid int,in ssex varchar(4) ,in sage int) -- in:传入类型参数
begin  -- 相当于c++中的{insert into db_2.student values(null,sname,scid,ssex,sage);select *from db_2.student where s_name = sname;
end; -- 相当于C++ 中的}-- SQL语句默认以分号;作为语句结束,并且总是以这条语句遇到的第一个分号作为整条语句的结束
-- 如果一个存储程序中需要执行多个语句时,则需要用begin...end 将这多条语句括起来
-- 将多条语句用begin end括起来会遇到SQL语句总是以这条语句遇到的第一个分号作为整条语句的结束问题

三、重定义结束符delimiter


注意:mysql执行SQL语句的过程中,会以‘;’作为结束符,所以一旦遇到‘;’数据库会认为当前SQL语句已经结束。
这里使用workbench编写存储过程时会出错,需要重定义结束符。


delimiter指令的基本使用:


    delimiter符号
-- 运用delimiter重定义结束符
    (如:delimiter // 或 delimiter $ 等)
然后存储过程的结尾是end//(而不是end;)
delimiter可定义任何符号为结束符,但最好不要覆盖符号本身的意义
执行完后需要delimiter;将结束符改回来。(要将分号改回来)

比如:

DELIMITER // -- 将‘//’ 设置为语句结束符
CREATE FUNCTION get_number_by_id(id INT)
RETURNS VARCHAR(300)
BEGIN
RETURN (SELECT CONCAT('name: ', name, '--', 'number: ', number)
FROM users_info WHERE uid = id);
END//
DELIMITER ; -- 将分号改回来

delimiter重定义结束符(workbench独有,其他可视化界面不需要)
-- 重定义结束符delimiter的基本格式
-- delimiter符号 -- 定义这个“符号”为语句结束符
-- 如 delimiter // -- 重定义'//'符号为语句最终结束符

注意:不建议以逗号,等于号,大于号等其他已经有特殊意义的符号作为语句最终结束符
因为这样会覆盖掉这个运算符本身的意义
如 delimiter ,-- 不建议重定义‘,’符号为语句最终结束符,因为会覆盖它作为分隔符的用法


四、存储过程和函数的区别


1:函数只能返回一个数据,而存储过程可以返回多个
2:函数的限制比较多,不能返回临时表(select),只能用表变量,而存储过程限制少,且可以使用动态SQL语句(如:
select);
3:存储过程处理的功能比较复杂,而函数实现数据的计算针对性强
4:存储过程可以执行修改表的操作,但是函数不能执行一组修改全局数据库状态的操作
5:存储过程可以通过out返回多个参数,而函数只能返回单个数据或者表对象


http://www.ppmy.cn/news/59514.html

相关文章

代码随想录算法训练营第四十九天 |动态规划 part10

121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…

HTML购物车示例(勾选、删除、添加和结算功能)

以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID。 以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID以下…

​Prometheus集群编队开发套件升级上市

Prometheus集群编队开发套件是一个面向集群、多智能体相关研究方向的无人机二次开发平台,采用分布式集群算法。与传统无人机集群相比,分布式无人机集群更加灵活、可靠和高效,可应用于更加复杂及多样化的任务场景。 分布式集群科研平台&#x…

重新理解快速排序

QuickSort QuickSort 版本一 依据 QuickSort版本一其实是依据 ‘荷兰国旗问题 实现的。只不过这次划分时只有大于或者小于num的数。 思路 取数组最右的数作为num,划分为两个区域(大于、小于) 在两个区域里重复第一部操作 QuickSort 版本二 依据 QuickSort版…

2.基础篇

目录 一、描述软件测试的生命周期(软件测试的流程) 二、如何描述一个bug 三、bug的级别(粗略划分) 四、bug的生命周期 五、因为一个bug和开发人员产生争执怎么办 六、如何设置弱网? 一、描述软件测试的生命周期&a…

Nomogram | 盘点一下绘制列线图的几个R包!~(二)

1写在前面 不知道各位小伙伴的五一假期过的在怎么样,可怜的我感冒了。😷 今天继续之前没有写完的列线图教程吧,再介绍几个制作列线图的R包。🤠 2用到的包 rm(list ls())library(tidyverse)library(survival)library(rms)library(…

面试整理 - 二叉排序树 c语言 及java 例子

什么是二叉排序树? 二叉排序树(binary search tree,bst)是一种特殊的二叉树,其中每个节点具有一个键值,并且满足一下两个要求: 对于任何节点x,其左子树上所有节点的关键字值小于x的关键字值。 …

第一次找实习, 什么项目可以给自己加分(笔记)

什么样的项目能简历加分、对找工作有帮助 基本特征: 一个特征是“硬核基础软件”,另一个为很实用的APP。 硬核基础软件 独立实现一个操作系统的kerne内核(操作系统的内部引擎) 北美计算机名校会让学生用一个学期的时间实现一个…