数据库存储过程要怎么写
SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。
推荐课程:MySql教程。
存储过程的优点:
(1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2).标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
(3).较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
(4).减少网络流量:针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织进存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载。
(5).作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
MySQL的存储过程
存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。
MySQL存储过程的创建
语法
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过程体
DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;
分隔符
MySQL默认以\”;\”为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个\”//\”之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。
参数
存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用\”,\”分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:
IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值OUT:该值可在存储过程内部被改变,并可返回INOUT:调用时指定,并且可被改变和返回
过程体
过程体的开始与结束使用BEGIN与END进行标识。
总结
本次主要是掌握了对于存储过程的使用,总的来说,存储过程实际上类似于C++中的函数,而在C++中我们是需要在创建这一过程的文件中去调用这一函数,但是对于存储过程来说,相当于是将这一操作过程存储在数据库中,可以使用call与对其进行调用,并输入或者输出一些参数和结果。
印象最深的是类似“in n int”和“out sum int”这样的对于输入输出的定义,通过查看相关博客,可以总结如下对于输入输出定义的使用规律:
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型
IN,OUT,INOUT
格式为:Create procedure|function([[IN |OUT |INOUT ] 参数名 数据类形…])
IN 输入参数
表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数
该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数
调用时指定,并且可被改变和返回
IN 和 OUT在实验中已有体会,主要是对INOUT的理解,这里引用一个例子:
参数inout的使用实例(既能输入一个值又能传出来一个值)
语句功能:传一个年龄,自动让年龄增长10岁
create procedure p3(inout age int)
begin
set age:=age+10;
end
其中:调用的时候,inout型的参数值既是输入类型又是输出类型,给它一个值,值不是变量,因此我们需要先设置一个变量并初始化这个值,调用的时候直接传这个变量即可。
set @currentAge=8$
call p3(@currentAge)$
select @currentAge$
创建并执行完存储过程,运行结果如下:
以上就是数据库存储过程要怎么写的详细内容,更多请关注其它相关文章!
更多技巧请《转发 + 关注》哦!
数据库的存储原理
在数据库管理系统中,数据的存取过程为:
- 应用程序通过 DML 向 DBMS 发出存取请求,如 SELECT 语句;
- 对命令进行语法检查,正确后检查语义和用户权限(通过数据字典 DD),并决定是否接收;
- 执行查询优化,将命令转换成一串单记录的存取操作序列;
- 执行存取操作序列;
- 在缓冲区中找记录,若找到转 10,否则转 6;
- 查看存储模式,决定从哪一个文件,用什么方式读取物理记录;
- 根据 6 的结果向操作系统(OS)发出读取记录的命令;
- OS 执行该命令,并读取记录数据;
- 在 OS 控制下,将读出的记录送入系统缓冲区;
- RDBMS 根据查询命令和 DD 的内容导出用户所要读取的记录格式;
- RDBMS 将数据从系统缓冲区中送入用户工作区;
- RDBMS 将执行状态信息(成功或失败)返回给应用程序;
- 应用程序对工作区中读出的数据进行相应处理。
数据库用文件的方式来存储数据。文件在逻辑上可看作是记录的序列,物理上这些记录被映射到磁盘块中。
当一条记录被删除时,可以把紧跟其后的记录移到被删记录的位置,以此类推,直到被删记录后面的每一条记录都向前做了移动。
但这种方法需要移动大量的记录,并不理想。所以可以暂时让被删除记录的空间一直空着,等待随后插入的记录使用这个空间。但仅在被删记录上做一个删除标记是不够的,因为当插入操作执行时,要找到这个可用空间比较困难,解决方法是引入额外的结构。
在文件的开始处,分配一定数量的字节作为文件头,文件头中存储有关文件的各种信息,也记录了第一条被删除的记录。再在第一条被删除记录的后面记录第二条被删除记录,这样就形成了一条链表,称为空闲链表。
文件中存储记录的常用方法有:堆文件组织,顺序文件组织,多表聚集文件组织,B+ 树文件组织和散列文件组织(后两种多用于索引记录)等。
一条记录可以放在文件中的任何地方,只要那个地方有空间存放记录。也就是说,文件中的记录是没有顺序的,是堆积来的。
顺序文件是为了高效地按某个搜索码值的顺序有序处理记录而设计的(搜索码是一个属性或属性集合,他不一定是主码甚至是超码)。为了快速地按搜索码值得顺序获取记录,通常通过指针将文件块逻辑上有序地连接起来。每个文件块的指针指向搜索码值顺序的下一个文件块(链表形式)。同时,为了减少顺序文件处理中文件块的访问数量,在物理上按搜索码值的顺序或者尽可能的接近搜索码值的顺序存储文件块。
顺序文件组织对于那些按搜索码值有序的特定查询非常有效,然而在插入和删除记录时为了维护记录的物理顺序却十分困难。改进操作:
- 插入操作:在文件中按搜索码值定位到待插入记录的文件块。
- 如果文件块 A 中有空闲空间,就在该文件中定位插入记录的位置,并插入新的记录;
- 否则申请一个溢出文件块,将文件块 A 中的记录平分一半到溢出文件块中,并将待插入记录插入到文件块 A 或溢出文件块中,再调整指针,使其能按搜索码值的顺序把文件块连接起来。
- 删除操作:在文件中按搜索码值定位待删除记录所在的文件块。在文件块 A 中定位待删除记录并实施删除(需要在文件块内向前移动删除记录之后的原有记录,使文件块内的空闲空间位于块尾)。如果删除后记录太少,
- 可考虑将文件块 A 的记录移到文件块所连接的文件块中,并释放 A 的空间。
- 可考虑从文件块 A 所连接的文件块中移出一部分记录到 A 中。
通常,在小型数据库管理系统中,每个关系的所有记录存储在一个单独的定长记录的文件中,这样可以充分利用操作系统所提供的文件系统功能,简化 DBMS 的设计。
然而,很多大型数据库管理系统在文件管理方面并不直接依赖操作系统,而是让操作系统分配给 DBMS 一个大的操作系统文件,DBMS 将所有关系存储在这个文件中,并且自己管理这个文件。
多表聚集文件组织是一种在每一个文件块中存储两个或多个关系的相关记录的文件结构。这种结构将多个关系的元组(行)混合在一起聚集存储,从而支持高效的连接运算。
例:
- 当 Student 表和 Score 表根据 studentNo 进行连接运算时,DBMS 会将 Score 表中所有 studentNo 值相同的元组(行)聚集地存储在 Student 表中对应元组的附近。
- 当读取 Student 表中的一个元组 t(行),包含元组 t 的整个文件块已经从磁盘中读取到主存储器中。由于 Score 关系中所有与元组 t 具有相同 studentNo 值得元组已聚集在元组 t 附近,所以已读入主存中包含元组 t 的文件块中也将包含 Score 表中与元组 t 相匹配的元组。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。