教学:数据库-存储过程资料
- 格式:doc
- 大小:500.00 KB
- 文档页数:14
MySQL存储过程实例教程MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的。
1:存储过程的创建这是一个创建存储过程的实例实例说明为了保证数据的完整性、一致性,提高应用的性能,常采用存储过程技术。
MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用。
本实例将介绍在MySQL 5.0以后的版本中创建存储过程。
技术要点一个存储过程包括名字、参数列表,以及可以包括很多SQL语句的SQL语句集。
下面为一个存储过程的定义过程: create procedure proc_name (in parameterinteger)begindeclare variable varchar(20);if parameter=1 thensetvariable='MySQL';elseset variable='PHP';end if;insert into tb (name) values (variable);end;MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。
MySQL的存储过程名称不区分大小写,例如PROCE1()和proce1()代表同一个存储过程名。
存储过程名不能与MySQL数据库中的内建函数重名。
存储过程的参数一般由3部分组成。
第一部分可以是in、out或inout。
in表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。
第二部分为参数名。
第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。
一、数据库存储过程
1)什么是存储过程?
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后想要数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
--说白了就是和调用函数差不多。
2)这么说存储过程就是一堆SQL语句而已啊?那为什么还需要这个技术呢?
存储过程的优点:
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
存储过程可以重复使用,可减少数据库开发人员的工作量
安全性高,可设定只有某此用户才具有对指定存储过程的使用权
3)用户自定义的存储过程
解释:
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
例:表book的内容如下
存储过程的3种传回值:
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中
实例3:设有两个表为Product,Order,其表内容如下:。
1. 存储过程简介常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
一个存储过程是一个可编程的函数,它在数据库中创建并保存。
它可以有SQL语句和一些特殊的控制结构组成。
当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。
数据库中的存储过程可以看做是对编程中面向对象方法的模拟。
它允许控制数据的访问方式。
存储过程通常有以下优点:(1).存储过程增强了SQL语言的功能和灵活性。
存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2).存储过程允许标准组件是编程。
存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。
而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
(3).存储过程能实现较快的执行速度。
如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。
因为存储过程是预编译的。
在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。
而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
(4).存储过程能过减少网络流量。
针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
(5).存储过程可被作为一种安全机制来充分利用。
系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
SQL学习之存储过程存储过程是一种SQL语句的集合,通过定义一组操作来实现特定功能。
它可以被保存在数据库中,并且可以在需要的时候被调用,减少了重复编写相同的SQL语句的工作量,并且可以提高数据库运行的效率。
本文将介绍存储过程的概念、优点、创建和调用方法,以及一些存储过程的应用场景。
概念:存储过程是一组预编译的SQL语句和控制语句的集合,被存储在数据库中。
它们可以被视为数据库中的子程序,可以实现特定的业务逻辑或数据操作功能。
存储过程可以接受输入参数,执行一系列操作,然后返回结果。
优点:1.重用性:存储过程可以被多次调用,避免了重复编写相同的SQL语句的工作量。
2.性能优化:存储过程可以提前编译和优化,提高数据库运行的效率。
3.安全性:存储过程可以限制用户对数据库的访问权限,提高数据库的安全性。
4.维护性:存储过程的修改只需要在数据库中进行一次操作,而不需要在应用程序中修改多次。
创建和调用存储过程:1.创建存储过程:可以使用CREATEPROCEDURE语句来创建存储过程。
存储过程由一些SQL语句和控制语句组成,并且可以接受输入参数。
例如,下面的代码创建了一个简单的存储过程,接受一个参数并返回查询结果:```sqlCREATE PROCEDURE GetEmployeesByDepartment(IN department_id INT)BEGINSELECT * FROM employees WHERE department_id = department_id;END```2.调用存储过程:可以使用CALL语句或者执行存储过程的方式来调用存储过程。
可以传递参数给存储过程,并且获取存储过程的返回结果。
例如,下面的代码调用了上面创建的存储过程,并且传递了一个参数:```sqlCALL GetEmployeesByDepartment(1);```应用场景:存储过程在实际应用中有广泛的应用场景,下面是一些常见的应用场景:1.数据验证和处理:存储过程可以用来对数据进行验证和处理,例如对数据进行格式校验、计算、数据清洗等操作。
数据库存储方法我折腾了好久数据库存储方法,总算找到点门道。
说实话,数据库存储这事儿,我一开始也是瞎摸索。
那时候就像在黑暗里乱撞的小动物一样。
我最早接触的时候,就只知道直接把数据一股脑儿往里塞,也不考虑啥结构。
那结果呢,可想而知,数据乱得一塌糊涂,查询的时候就像在乱麻里找一根针,特别费劲,这就是我犯的一个很大的错误。
后来我慢慢明白,数据得有个良好的结构。
这就好比盖房子,你得先有个稳固的框架。
对于数据库来说,先设计好表结构就很重要。
比如说我做一个简单的学生信息存储的数据库,就像建一个装满学生资料的柜子。
首先得有针对姓名、年龄、年级这些不同信息的抽屉,这就是各个表中的字段。
这个过程不能马虎,我之前就是没规划好,事后想改都很麻烦。
还有索引这个东西,我一开始根本不知道它是干嘛的。
后来发现它就像是给每个数据抽屉上贴的小标签,有了它,数据库在查找数据的时候就能很快定位到该去哪个抽屉找,大大提高了查找速度。
不过索引也不能乱建,就像你不能在每个东西上都贴无数个标签,那反而会搞得更乱。
我就试过建了一堆不必要的索引,结果写操作的时候速度变得特别慢,后来才知道是索引太多的缘故,把一些不必要的删掉后查询和写操作的速度就平衡多了。
数据存储还涉及到事务处理。
我以前不太重视这个,有次在有很多并发操作的时候,数据就出现了不一致的情况。
这就好像几个人同时想往同一个抽屉里放东西或者拿东西,要是没有一个好的规则,这个抽屉里的东西就会变得乱七八糟。
事务就像个管理员,能确保在他指挥下的操作,要么都成功,要么都失败,保证数据的一致性。
安全性也是个重点。
我最开始的时候,把数据库的加密当成可有可无的东西。
这就好比你盖了房子却不装锁,那谁都能进去翻腾你的东西。
后来我吃过亏,明白了要设置合适的用户权限,对敏感数据加密,这样才能保证数据的安全存储。
我觉得在数据库存储的时候,规划好表结构、合理运用索引、重视事务处理和保证安全性都是很关键的点,这也是我在不断摸索这个数据库存储过程中的所思所得。
教学三:存储过程一、教学目的(1)掌握T-SQL流控制语句;(2)掌握创建存储过程的方法;(3)掌握存储过程的执行方法;(4)掌握存储过程的管理和维护。
二、教学内容1、创建简单存储过程(1)创建一个名为stu_pr的存储过程,该存储过程能查询出051班学生的所有资料,包括学生的基本信息、学生的选课信息(含未选课同学的信息)。
要求在创建存储过程前请判断该存储过程是否已创建,若已创建则先删除,并给出“已删除!”信息,否则就给出“不存在,可创建!”的信息。
if exists(select name from sysobjects where name='stu_pr'and type='p')beginprint'已删除!'drop procedure stu_prendelseprint'不存在,可创建!'gocreate procedure stu_prasselect*from Student_20103322left outer join SC_20103322on (Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322on (Course_o=SC_o)where classno='051'exec stu_pr2、创建带参数的存储过程(1)创建一个名为stu_proc1的存储过程,查询某系、某姓名的学生的学号、姓名、年龄,选修课程名、成绩。
系名和姓名在调用该存储过程时输入,其默认值分别为“%”与“林%”。
执行该存储过程,用多种参数加以测试。
if exists(select name from sysobjects where name='stu_proc1'and type='p')beginprint'已删除!'drop procedure stu_proc1endelseprint'不存在,可创建!'gocreate procedure stu_proc1@Sdept char(8)='%',@Sname varchar(8)='林%'asselect Sdept,Student_20103322.Sno,Sname,DATEDIFF(YEAR,Birth,GETDATE())age,Cname,Grade from Student_20103322,SC_20103322,Course_20103322where Student_20103322.Sno=SC_20103322.Snoand Course_o=SC_oand Sdept like@Sdeptand Sname like@Snameexecute stu_proc1'计算机系','林红'execute stu_proc1'信息安全','胡光璟'(2)创建一个名为Student_sc的存储过程,可查询出某段学号的同学的学号、姓名、总成绩。
(学号起始号与终止号在调用时输入,可设默认值)。
执行该存储过程。
if exists(select name from sysobjects where name='Student_sc'and type='p') beginprint'已删除!'drop procedure student_scendelseprint'不存在,可创建!'gocreate procedure Student_sc@Sno1char(8),@Sno2char(8)asselect Student_20103322.Sno,Sname,SUM(Grade)总成绩from Student_20103322,SC_20103322,Course_20103322where Student_20103322.Sno=SC_20103322.Snoand Course_o=SC_oand Student_20103322.Sno>=@Sno1and Student_20103322.Sno<=@Sno2group by Student_20103322.Sno,Snameexecute Student_sc'20110000','20110003'3、创建带输出参数的存储过程(1)创建一个名为Course_sum的存储过程,可查询某门课程考试的总成绩。
总成绩可以输出,以便进一步调用。
if exists(select name from sysobjects where name='Course_sum'and type='p') beginprint'已删除!'drop procedure Course_sumendelseprint'不存在,可创建!'gocreate procedure Course_sum@Cname varchar(20),@sum int outputasselect@sum=sum(Grade)from SC_20103322,Course_20103322where Course_o=SC_oand Cname=@Cnamegroup by SC_o,Cnamedeclare@ping intexec Course_sum'高数',@ping outputprint'高数的考试总成绩为:'+cast(@ping as varchar(20))(2)创建一执行该存储过程的批处理,要求当总成绩小于100时,显示信息为:“XX课程的总成绩为:XX,其总分未达100分”。
超过100时,显示信息为:“XX课程的总成绩为:XX”。
declare@sum intdeclare@Cname varchar(20)Exec Course_sum@cname,@sum outbeginif@sum<100print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)+',其总分未达分' elseprint cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)enddeclare@sum intdeclare@Cname varchar(20)set@Cname='高数'Exec Course_sum@cname,@sum outbeginif@sum<100print cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)+',其总分未达分' elseprint cast(@cname as varchar)+'课程的总成绩为:'+cast(@sum as varchar)end4、创建带重编译及加密选项的存储过程创建一个名为update_sc、并带重编译及加密选项的存储过程,可更新指定学号、指定课程号的学生的课程成绩。
(学号、课程号由调用时输入)if exists(select name from sysobjects where name='update_sc'and type='p')beginprint'已删除!'drop procedure update_scendelseprint'不存在,可创建!'gocreate procedure update_sc@sno char(8),@cno char(3),@grade tinyintwith RECOMPILE,ENCRYPTIONasupdate SC_20103322set Grade=@gradewhere Sno=@sno and Cno=@cnodeclare@sno char(8),@cno char(3),@grade tinyintset@sno='20103322'set@cno='003'set@grade='100'exec update_sc@sno,@cno,@gradebeginprint cast(@sno as varchar)+'的'+cast(@cno as varchar)+'课程成绩为:'+cast(@grade as varchar)end5、使用T-SQL语句管理和维护存储过程(1)使用sp_helptext查看存储过程Student_sc的定义脚本exec sp_helptext student_sc(2)使用select语句查看Student_sc存储过程的定义脚本(提示:通过查询表sysobjects和表syscomments)select*from sysobjects,syscommentswhere name='Student_sc'(3)将存储过程stu_pr改为查询学号为2011001的学生的详细资料。
alter procedure stu_prasselect*from Student_20103322left outer join SC_20103322on (Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322on (Course_o=SC_o)where Student_20103322.Sno='2011001'(4)删除存储过程stu_pr。
drop procedure stu_pr6、使用SQL Server Management Studio管理存储过程(1)在SQL Server Management Studio中重新创建刚删除的存储过程stu_prcreate procedure stu_prasbeginselect*from Student_20103322left outer join SC_20103322on (Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322on (Course_o=SC_o)where Student_20103322.Sno='2011001'end(2)查看存储过程stu_pr,并将该过程修改为查询051班女生的所有资料。