MySQL数据库高级(四)——存储过程

MySQL数据库高级(四)——存储过程

一、存储过程简介

1、存储过程简介

存储过程是一组具有特定功能的SQL语句集组成的可编程的函数,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数来调用执行。
存储过程是数据库管理中常用的技术之一,可以很方便的做些类似数据统计、数据分析等工作,SQL SERVER、ORACLE、MySQL都支持存储过程,但不同的数据库环境语法结构有所区别。

2、存储过程的优点

A、存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
B、存储过程允许标准组件式编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
C、存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
D、存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
E、存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

二、存储过程的使用

1、存储过程的创建

创建存储过程的语法:

CREATE
    [DEFINER = { user | CURRENT_USER }]
 PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

characteristic:
    COMMENT ‘string‘
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }

routine_body:
  Valid SQL routine statement

[begin_label:] BEGIN
  [statement_list]
    
END [end_label]

IN输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值。
OUT输出参数:该值可在存储过程内部被改变,并可返回。
INOUT输入输出参数:调用时指定,并且可被改变和返回。
A、无参数的存储过程创建
创建查找平均分最高的前三名同学的存储过程

create procedure getMax()
BEGIN
select a.sname as ‘姓名‘, AVG(b.mark) as ‘平均分‘ from
TStudent a join TScore b on a.studentID=b.studentID
group by b.studentID order by ‘平均分‘ DESC limit 3;
END;

B、带输入参数的存储过程创建
查找指定班级的平均分最高的前三名学生

create procedure getMaxByClass(in classname VARCHAR(10))
BEGIN
select a.sname as ‘姓名‘, AVG(b.mark) as ‘平均分‘ from
TStudent a join TScore b on a.studentID=b.studentID where a.class=classname
group by b.studentID order by ‘平均分‘ DESC limit 3;
END

C、带输入参数和输出参数的存储过程创建
根据输入的班级,找到学号最大的学生,将学号存储到输出参数。

create procedure getMaxSIDByClass(IN classname VARCHAR(20), out maxid int)
BEGIN
select MAX(studentID) into maxid from TStudent where class=classname;
END;

2、存储过程的删除

drop procedure sp_name;
不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。

3、存储过程的调用

call sp_name[(传参)];
存储过程名称后面必须加括号,即使存储过程没有参数传递。

4、存储过程信息的查看

show procedure status;
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等。
show create procedure sp_name;
显示某一个存储过程的详细信息。

5、使用存储过程插入数据

create procedure insertTStudent(in sid CHAR(5), name CHAR(10), ssex CHAR(1))
BEGIN
insert into TStudent (studentID, sname, sex)VALUES(sid, name, ssex);
select * from TStudent where studentID=sid;
END;
call insertTStudent(‘01020‘,‘孙悟空‘,‘男‘);

6、使用存储过程删除数据

根据提供的学号删除先删除学生的学生成绩,再删除学生。

create procedure deleteStudent(in sid CHAR(5))
BEGIN
delete from TScore where studentID=sid;
delete from TStudent where studentID=sid;
END;

7、使用存储过程备份还原数据

A、使用存储过程备份数据
创建存储过程备份学生表,根据指定的表名创建新表,将TStudent表中的记录导入到新表。

create procedure backupStudent(in tablename CHAR(10))
BEGIN
set @sql1=CONCAT(‘create table ‘,tablename,‘
(
studentID VARCHAR(5),
sname VARCHAR(10),
sex CHAR(1),
cardID VARCHAR(20),
Birthday DATETIME,
email VARCHAR(20),
class VARCHAR(10),
enterTime DATETIME
)‘);
prepare CT1 from @sql1;
EXECUTE CT1;

set @sql2=CONCAT(‘insert into ‘, tablename,
‘(studentID,sname,sex,cardID,Birthday,email,class,enterTime)
select studentID,sname,sex,cardID,Birthday,email,class,enterTime from TStudent‘);
PREPARE CT2 from @sql2;
EXECUTE CT2;
END;

call backupStudent(‘table2019‘);

B、使用当前时间作为表名备份数据
创建存储过程,使用系统当前事件构造新的表名,备份Tstudent表中的记录。

create procedure backupStudentByDateTime()
BEGIN
DECLARE tablename VARCHAR(20);
set tablename = CONCAT(‘Table‘, REPLACE(REPLACE(REPLACE(now(),‘ ‘,‘‘),‘:‘,‘‘),‘-‘,‘‘));
set @sql1=CONCAT(‘create table ‘,tablename,‘
(
studentID VARCHAR(5),
sname VARCHAR(10),
sex CHAR(1),
cardID VARCHAR(20),
Birthday DATETIME,
email VARCHAR(20),
class VARCHAR(10),
enterTime DATETIME
)‘);
prepare CT1 from @sql1;
EXECUTE CT1;

set @sql2=CONCAT(‘insert into ‘, tablename,
‘(studentID,sname,sex,cardID,Birthday,email,class,enterTime)
select studentID,sname,sex,cardID,Birthday,email,class,enterTime from TStudent‘);
PREPARE CT2 from @sql2;
EXECUTE CT2;
END

call backupStudentByDateTime();

C、使用存储过程还原数据
创建存储过程,根据输入的学号从指定的表还原学记录,存储过程先删除指定的学号的TStudent表中学生记录,再从指定的表中插入该学生到Tstudent表。

create procedure restoreStudent(in sid VARCHAR(5), in tablename VARCHAR(20))
BEGIN
set @sql1=concat(‘delete from TStudent where studentid=‘,sid);
prepare CT1 from @sql1;
EXECUTE CT1;
set @sql2=concat(‘insert into TStudent
 (Studentid,sname,sex,cardID,Birthday,Email,Class,enterTime)
  select Studentid,sname,sex,cardID,Birthday,Email,Class,enterTime
  from ‘,tablename,‘ where studentid=‘,sid);
prepare CT2 from @sql2;
EXECUTE CT2;
END;

修改某个学生的记录
update TStudent set sname=‘孙悟空‘ where studentID=‘00997‘;
从指定表中恢复数据
call restoreStudent(‘00997‘, ‘Table20180404215950‘);
查看恢复的结果
select * from TStudent where studentID=‘00997‘;

三、存储过程实例

1、增加学生到数据库表

create procedure addStudent(in num int)
begin
declare i int;
set i=1;
delete from TStudent;
while num>=i do
insert TStudent values
(
       LPAD(convert(i,char(5)),5,‘0‘),
       CreateName(),
       if(ceil(rand()*10)%2=0,‘男‘,‘女‘),
       RPAD(convert(ceil(rand()*1000000000000000000),char(18)),18,‘0‘),
       Concat(convert(ceil(rand()*10)+1980,char(4)),‘-‘,LPAD(convert(ceil(rand()*12),char(2)),2,‘0‘),‘-‘,LPAD(convert(ceil(rand()*28),char(2)),2,‘0‘)),
       Concat(PINYIN(sname),‘@hotmail.com‘),
       case ceil(rand()*3) when 1 then ‘网络与网站开发‘ when 2 then ‘JAVA‘ ELSE ‘NET‘ END,
       NOW()
);
set i=i+1;
end while;
select * from TStudent;
end

2、给学生添加成绩

create procedure fillScore()
begin
DECLARE St_Num INT;
DECLARE Sb_Num INT;
DECLARE i1 INT;
DECLARE i2 INT;
set i1=1;
set i2=1;
delete from TScore;
select count(*) into St_Num from TStudent;
select count(*) into Sb_Num from TSubject;
while St_Num>=i1 do
set i2=1;
while Sb_Num>=i2 do
insert TScore values
 (LPAD(convert(i1,char(5)),5,‘0‘),LPAD(convert(i2,char(4)),4,‘0‘),ceil(50+rand()*50));
set i2=i2+1;
END WHILE;
set i1=i1+1;
END WHILE;
end

原文地址:http://blog.51cto.com/9291927/2094915

时间: 2024-10-09 12:00:44

MySQL数据库高级(四)——存储过程的相关文章

MySQL数据库高级(五)——触发器

MySQL数据库高级(五)--触发器 一.触发器简介 1.触发器简介 触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力. 2.触发器的优点 A.安全性可以基于数据库的值使用户具有操作数据库的某种权利.可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据:可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%.B.审计可以跟踪用户对数据库的操作.???审计用户操作数据库的语句:把

MySQL数据库高级(六)——索引

MySQL数据库高级(六)--索引 一.索引简介 1.索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构.在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的.MyISAM和InnoDB存储引擎只支持BTREE索引,MEMORY/HEAP存储引擎支持HASH和BTREE索引. 2.索引的优点 A.提高数据检索效率,降低数据库的IO成本.B.通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗.C.大大加快数据的查询速度. 3.索引的缺点 A.

MySQL数据库高级(九)——游标

MySQL数据库高级(九)--游标 一.游标简介 1.游标简介 游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果.游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制.尽管游标能遍历结果中的所有行,但一次只指向一行.游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作. 2.游标的特性 游标具有三个属性:A.不敏感(Asensitive):数据库可以选择不复制结果集B.只读(Read only)C.不滚动(Nonscrollable):游标只能向一个方向

MySQL数据库高级(二)——自定义函数

MySQL数据库高级(二)--自定义函数 一.自定义函数简介 自定义函数 (user-defined function UDF)是一种对MySQL扩展的途径,其用法和内置函数相同.自定义函数的两个必要条件:A.参数B.返回值(必须有).函数可以返回任意类型的值. 二.自定义函数的使用 1.自定义函数语法 CREATE?FUNCTION?function_name(parameter_nametype,[parameter_name type,...]) RETURNS?{STRING|INTEG

MySQL数据库高级(三)——视图

MySQL数据库高级(三)--视图 一.视图简介 1.视图简介 视图是由SELECT查询语句所定义的一个虚拟表,是查看数据的一种非常有效的方式.视图包含一系列带有名称的数据列和数据行,但视图中的数据并不真实存在于数据库中,视图返回的是结果集. 2.创建视图的目的 视图是存储在数据库中的查询的SQL语句,创建视图主要出于两种原因:A.实现安全.视图可设置用户对视图的访问权限.创建查询是JAVA班学生成绩的视图javaview.NET班学生成绩的视图netview,授权zhang能够访问javavi

MySQL数据库 高级查询(一)

常用函数 常用聚合函数: AVG() 返回某字段的平均值 COUNT() 返回某字段的行数 MAX() 返回某字段的最大值 MIN( ) 返回某字段的最小值 SUM( ) 返回某字段的和 函数名 作用 常用的字符串函数 函数名 作用 举例 CONCAT(str1,str2,...,strn) 连接字符串str1,str2,...,strn为一个完整字符串 SELECT CONCAT('My','S','QL'); 返回:MySQL INSERT(str,pos,len,newstr) 将字符串s

用JAVA调用Mysql数据库,数据存储过程的封装与调用;

1.存储过程的封装:右键函数--新增函数--选择进程(进程是没有返回值的)或者选择函数(函数是有返回值的) 2.在这里我们选择进程--进入后点击下一步 模式中有IN(往里输入参数),OUT(往外输出参数),INOUT,在这里我们通常使用的就是IN和OUT,如果什么也不写系统默认为IN. 建立好函数之后我们既要把要执行的命令封装到函数里,例如: 注意:在写完一条语句后要加分号,参数varchar类型后要加上长度. 实例: package com.inba.maya.cunchu; import j

MySQL数据库实验四:嵌套查询

实验四          嵌套查询 一.实验目的 掌握SELECT语句的嵌套使用,实现表的复杂查询,进一步理解SELECT语句的高级使用方法. 二.实验环境 三.实验示例 1.  查询与"刘晨"在同一个系学习的学生. SELECT Sno,Sname,Sdept FROM Student WHERE Sdept  IN (SELECT Sdept FROM Student WHERE Sname= ' 刘晨 '): 用自身连接完成 SELECT  S1.Sno,S1.Sname,S1.

【数据库】MySQL数据库(四)

一.对数据的操作(详细版) 1.添加数据 1> insert into 表名 (字段1,字段2...) values (值1,值2...); 2> insert into 表名 (字段1,字段2...) values (值1,值2...),(值1,值2...); 3> insert into 表名 values (值1,值2,值3...); 4> insert into 表名 values (值1,值2,值3...),(值1,值2,值3...); 5> insert into