首页 > 数据库 >数据库之存储过程

数据库之存储过程

时间:2024-10-30 17:59:45浏览次数:1  
标签:存储 end int 数据库 BEGIN END 过程 create

存储过程

一、存储过程介绍

1、什么是存储过程?

存储过程是实现某个特定功能的sql语句的集合,编译后的存储过程会保存在数据库中,通过存储过程的名称反复的调用执行。

2、存储过程的优点?

(1)存储过程创建后,就可以反复的调用和使用,不需要重新写复杂的语句
(2)创建,修改存储过程不会对数据有任何的影响
(3)存储过程可以通过输入参数返回输出值
(4)通过存储过程中加入控制语句,可以加强sql语句的功能性和灵活性
(5)对于单个l语句增删改查,可以直接封装一个集合中,存储过程一旦创建就可以直接调用,且可以重复调用
(6)单个sql语句每一次执行都需要对数据进行编译,而存储过程被创建只需要编译一次,后续即可调用
(7)创建的存储过程,可以重复进行调用,可以减少数据库开发人员的工作量
(8)防止sql 注入
(9)造数据(重点)

3、Mysql 5.0版本后支持存储过程,存储过程=sql语句集合+控制语句

===================================================================
格式:
delimiter // #分隔符 符号 //
create PROCEDURE 存储名( 参数名:in out inout)
BEGIN 开始
sql语句 执行语句
END 结束
// 分隔符号
call 存储名(参数) 调用一个存储过程

案例:
delimiter //
create PROCEDURE hz001()
BEGIN
SELECT * from emp ;
select * from dept ;
END
//
call hz001()

三、存储过程的基本语句:

(1) 删除存储过程

格式:drop procedure 存储名称

案例:drop procedure hz001

(2)查看单个存储过程的详情

格式:show create procedure 存储过程;

案例:show create procedure hz001;

(3)查看所有已经建好的存储过程详情

格式:show procedure status

(4)查询指定数据库里创建的存储过程

格式:show procedure status where db="数据库名"

案例:show procedure status where db="hz017"

四、创建存储

1、创建无参数存储过程

格式:
delimiter //
create PROCEDURE 存储名1() #无参数,是括号内无参数
BEGIN #开始
sql语句 #执行语句
END #结束
// 结束符号
call 存储名() 调用存储名称

案例:
delimiter //
create PROCEDURE hz1() #无参数,是括号内无参数
BEGIN
SELECT * from emp where dept2=101 ;
END
//
call hz1()

2、带有in参数的存储

in表示输入数据

格式:
delimiter //
create PROCEDURE 存储名(in x int ) #in参数,是括号
BEGIN
sql语句
END
//
call 存储过程(入参)

案例:
delimiter //
create PROCEDURE hz(in x int ) #无参数,是括号内无参数
BEGIN
SELECT * from emp where dept2=x ;
END
//
call hz(105)

3、带out 的参数(输出参数)

格式:
delimiter //
create PROCEDURE 存储名(out x int ) #in参数,是括号
BEGIN
sql语句
END
//
call 存储过程(入参)

案例:
delimiter //
create PROCEDURE hz5(out y int ) #无参数,是括号内无参数
BEGIN
SELECT age into y from emp where dept2=105;
END
//
call hz5(@y)
select @y


带有 in 和 out 的存储过程

案例:
delimiter //
create PROCEDURE hz6(in x int ,out y int ) #无参数,是括号内无参数
BEGIN
SELECT age into y from emp where dept2=x;
END
//
call hz6(109,@y)
select @y

===========================================================================
inout参数 代表着输入和输出

案例1:
delimiter //
create PROCEDURE hz8(inout m int ) #无参数,是括号内无参数
BEGIN
set m=m+1;
END
//
set @m=2
call hz8(@m)
select @m


案例2:
delimiter //
create PROCEDURE hz9(inout x int ) #无参数,是括号内无参数
BEGIN
SELECT age into x from emp where dept2=x;
END
//

set @x=109
call hz8(@x)
select @x

备注:
CHARACTER set UTF8 解决?号

===========================================
用户变量:
定义语法L
set @ 变量名

赋值的方法:
(1)方式一
set @ 变量名:=值

set @变量名=值;
select @变量名:=值;

(2)方式二

通过查询结果为变量赋值:
select 字段 into 变量名 from 表名 where 条件

(3)declare 声明变量

例如:declare i int default 0 ;

============================================
循环语句:
三种:
(1)while ......do ......end where

while 循环语句:
格式:while 条件 do

sql语句

end while

(2) loop ......end loop

(3) repeat.......until ,,,,,end repeat

============================================
造数据场景:

1、通过存储过程在一个指定的空表中插入10条数据?

案例:
drop table ff ;
CREATE table ff(id int (10),age int(10));
select * from ff ;
delimiter //
drop procedure if exists hz10; #增强健壮性, 判断是否存在指定存储过程,如果存在就删除;
create procedure hz10()
BEGIN
DECLARE i int DEFAULT 0 ;
while (i<10) DO
INSERT into ff(id )VALUES (i);
set i=i+1;
end WHILE;
select * from ff ;
END
//
call hz10()

场景2:插入指定数据的行数

delimiter //
DROP table if EXISTS ff ;
drop procedure if exists hz10; #增强健壮性, 判断是否存在指定存储过程,如果存在就删除;
CREATE table ff(id int (10),age int(10));
create procedure hz10( in x int )
BEGIN
DECLARE i int DEFAULT 0 ;
while (i<x) DO
INSERT into ff(id )VALUES (i);
set i=i+1;
end WHILE;
select * from ff ;
END
//
call hz10(5)

场景三: 指定插入的数据,并将已有的数据统计,在已有的数据基础上在添加

delimiter //
DROP table if EXISTS ff ;
drop procedure if exists hz10; #增强健壮性, 判断是否存在指定存储过程,如果存在就删除;
CREATE table ff(id int (10),age int(10));
create procedure hz10( in x int )
BEGIN
DECLARE i int DEFAULT (select Count(*) from ff ) ;
while (i<x) DO
INSERT into ff(id )VALUES (i+1);
set i=i+1;
end WHILE;
select * from ff ;
END
//
call hz10(100)

==============================================
面试题:

1、你会存储码?

2、存储的结构?

3、在工作中你们用存储做什么? 造数据

4、你会写存储吗?

============================================
if 语句
if 的单分支

if 条件 then
执行sql1
else
执行sql2
end if ;

案例:
delimiter //
create procedure hz11( in a int )

BEGIN
if a>10 THEN
SELECT * from emp ;
ELSE
SELECT * from dept;
end if;
END
//
call hz11(9)


一个if 对应一个end if


if 多分支

在if 判断语句汇总,有几个判断分支if,就有几个结束语 end if ;

if 条件 1 then
执行sql1
else if 条件2 then
执行sql2
else if 条件3 then
执行sql3
end if ;
end if ;
end if;
end

案例:
create procedure hz12( in a int )
BEGIN
if a>100 THEN
SELECT * from emp ;
ELSE if a<10 then
SELECT * from dept;
else if a=50 then
select * from student2 ;
ELSE
SELECT * from ff ;
end IF;
end IF;
end if;
END
//
call hz12(9)

=========================================

面试题:根据student学生表去写
1.当传入的参数(大于0)小于等于表里面数据的条数时,则根据分组显示班级的总成绩
2.当传入的参数大于表里面数据的条数时,则统计表里面的数据有多少条
3.当传入其他,则查询表里面的所有数据

方法1:
delimiter //
create procedure hz09( in x int )
BEGIN
DECLARE i int DEFAULT (select Count() from student2 );
if x<=i and x>0 THEN
SELECT sum(chinese+math+english) from student2 group by class;
ELSE if x>i then
SELECT count(
) from student2;
else
select * from student2;
end if;
end if;
END
//
call hz09(6)

方法2:
select * from xsb;
delimiter //
create procedure student1( in a int )
BEGIN
if a>0 and a<=(select count(id) from xsb) THEN
SELECT sum(english+chinese+math) from xsb GROUP BY class ;
ELSE if a>(select count(id) from xsb) then
SELECT count(id) from xsb;
ELSE
SELECT * from xsb ;
end IF;
end IF;
END
//

标签:存储,end,int,数据库,BEGIN,END,过程,create
From: https://www.cnblogs.com/weiyus1916/p/18516314

相关文章

  • InnoDB 存储引擎<四>磁盘文件一
    目录磁盘文件系统表空间-SystemTablespace 独⽴表空间-File-Per-TableTablespace  撤销表空间-UndoTablespaces磁盘文件1.InnoDB存储引擎包含哪些磁盘⽂件?分析过程:从官⽹给出的InnoDB架构图中可以找到答案InnoDB存储引擎架构链接解答问题:......
  • SQL Server创建用户只能访问指定数据库和视图
    我们在给数据库用户赋予权限时,有时候不想让该用户看到太多过程表和过程视图,这时就需要限定用户的访问权限第一步:创建用户创建数据库连接后,进入安全性——登录名,单击右键,新建登录名,并设置默认数据库第二步:设置用户映射点击用户映射,勾选指定要访问的数据库,数据库成员身份默认......
  • 帝国CMS从文章模型“内容存数据库”改为“内容存文本”的方案
    在帝国CMS文章模型(news)的newstext字段默认是“内容存文本”的模式,但是有时候我们刚建站时出于某种原因把这个默认模式修改成了“内容存数据库”了。网站运行一段时间后,我们发现数据库越来越大,这时候想把它重新修改为“内容存文本”的模式,可以有效为数据库减负。但因为表里已经存在......
  • Oracle数据库AWR报告中高等待事件优化方法
    一、理解等待事件什么是等待事件在Oracle数据库中,等待事件是指会话在执行SQL语句时,由于某些资源(如磁盘I/O、锁、缓冲区等)暂时不可用而必须等待的情况。AWR报告中的等待事件部分可以帮助我们识别数据库性能瓶颈的关键所在。确定高等待事件类型常见的高等待事件包括:......
  • 【GiraKoo】线程本地存储(Thread Local Storage, TLS)
    【技术分享】线程本地存储(ThreadLocalStorage,TLS)在项目开发中,遇到了关于TLS相关的问题。为了了解该机制的用途,在微软的官网查找了一些资料。本文参考官方文档,简单介绍一下TLS的用途与使用方法。微软官方文档链接一、简介线程本地存储(TLS),可以使多个线程,通过TlsGetValue函......
  • 数据库的连接过程
    首先新建lib包将mysql的jar文件复制进去随后右键lib将其添加到库随后添加代码运行成功说明连接成功,再测试添加数据数据库中出现添加的数据说明添加成功,数据库连接成功......
  • WD MYbook存储硬盘数据恢复
    WDMYBOOK存储硬盘数据恢复是一个相对复杂但可行的过程,以下是一些建议的恢复方法:一、硬件检查与恢复检查连接线:重新插拔连接线,确保连接稳固且没有损坏。如果连接线有问题,尝试更换一条新的连接线。2.更换电脑设备:如果在一个电脑上无法识别移动硬盘,可以尝试将其连接到另一台电......
  • MySQL数据库详细介绍:从入门到进阶
    MySQL是一个广泛使用的开源关系型数据库管理系统,被广泛应用于Web应用程序、企业级应用以及各种数据分析场景。本文将详细介绍MySQL数据库的基本概念、安装、配置、管理以及优化等方面的内容,帮助大家从入门到进阶了解MySQL。 一、MySQL安装可以通过以下链接下载MySQL安装包:......
  • 使用asp.net mvc 过程中 参数传递的问题记录。
    环境:asp.netMVC需求:要实现主从表数据存储,主表为结构化信息,附表为对应的图片。实现过程:页面中当用户在新建数据的时候,未保存时没有主表的主键,同时用户也会选择要上传的图片一同保存。 使用ajaxfileupload.js实现多文件上传,上传之后通过window.URL.createObjectURL将上传......
  • 数据库之外键
    一、外键的介绍1、外键的定义让一张表记录的数据不要太过于冗余,在数据库中对表的关系进行解耦,尽量让表的数据单一化。2、外键的作用保持数据的一致性和完整性3、msyql数据库中的存储引擎?myisam(默认)innodb(外键需要用到innodb存储格式)4、查看存储引擎格式:showtable......