成都开发网站建设,制作展示型网站的公司,做网站业务提成多少,沉默是金 张国荣数据库中的存储过程Procedure 简介使用语法声明存储过程调用存储过程存储过程的参数调用存储过程无参数有参数 简介
存储过程#xff08;Stored Procedure#xff09;是大型数据库系统中#xff0c;一组为了完成特定功能的SQL 语句集#xff0c;是数据库对象之一。存储过程… 数据库中的存储过程Procedure 简介使用语法声明存储过程调用存储过程存储过程的参数调用存储过程无参数有参数 简介
存储过程Stored Procedure是大型数据库系统中一组为了完成特定功能的SQL 语句集是数据库对象之一。存储过程 预先存储在数据库MySQL 服务器中只在创建时进行编译一次编译后永久有效需要执行时 用户 通过客户端 只需要指定存储过程的名字【并给出参数如果该存储过程带有参数】、向服务器端发出调用存储过程的命令服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。存储过程可以完成所有的数据库操作。存储过程在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
比如在实现用户的某些需求时需要编写一组复杂的SQL语句才能实现的时候那么我们就可以将这组复杂的SQL语句集提前编写在数据库中由JDBC调用来执行这组SQL语句。把编写在数据库中的SQL语句集称为存储过程。
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起应用程序无须关注存储过程和函数内部复杂的SQL逻辑而只需要简单地调用存储过程和函数即可。存储过程存储在 MySQL 服务器上需要执行的时候客户端只需要向服务器端发出调用存储过程的命令服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。
存储过程的好处有
减少网络传输量客户端不需要把所有的 SQL 语句通过网络发给服务器减少了 SQL 语句暴露在网上的风险也提高了数据查询的安全性代码复用 和 良好的封装性。将代码 封装 成模块实际上是编程的核心思想之一这样可以把复杂的问题拆解成不同的模块然后模块之间可以 重复使用 在减少开发工作量的同时还能保证代码的结构清晰。在进行相对复杂的数据库操作时原本需要使用一条一条的 SQL 语句可能要连接多次数据库才能完成的操作现在变成了一次存储过程只需要 连接一次即可 。
存储过程的缺点有
可移植性差。存储过程不能跨数据库移植比如在 MySQL、Oracle 和 SQL Server 里编写的存储过程在换成其他数据库时都需要重新编写。调试困难。只有少数 DBMS 支持存储过程的调试。对于复杂的存储过程来说开发和维护都不容易。虽然也有一些第三方工具可以对存储过程进行调试但要收费。存储过程的版本管理很困难。比如数据表索引发生变化了可能会导致存储过程失效。我们在开发软件的时候往往需要进行版本管理但是存储过程本身没有版本控制版本迭代更新的时候很麻烦。不适合高并发的场景。高并发的场景需要减少数据库的压力有时数据库会采用分库分表的方式而且对可扩展性要求很高在这种情况下存储过程会变得难以维护 增加数据库的压力 显然就不适用了。
使用语法 声明存储过程
如下所示[characteristics ...] 表示创建存储过程时指定的【对存储过程的】约束条件其取值信息如下
LANGUAGE SQL[NOT] DETERMINISTICCONTAINS SQL NO SQLREADS SQL DATAMODIFIES SQL DATASQL SECURITY DEFINER INVOKERCOMMENT ‘string’
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN存储过程体比如声明变量declare name varchar(10); //使用的位置要在 BEGIN…END 语句中间而且需要在其他语句使用该变量之前。赋值语句用于对变量进行赋值SET 。将【从数据表中查询的】结果存放到声明的变量中select Sname into name from student where Snosno limit 1;返回变量select name;
END调用存储过程
CALL 存储过程名称(实参列表);存储过程必须使用CALL语句调用并且存储过程和数据库相关如果要执行其他数据库中的存储过程需要指定数据库名称例如CALL dbname.procname。
存储过程的参数
存储过程就类似于Java中的方法需要先定义使用时需要调用。存储过程可以定义参数参数分为IN、OUT、INOUT类型三种类型。
IN类型的参数表示接受调用者传入的参数在存储过程的参数未指定类型时IN是默认类型OUT类型的参数表示向调用者返回数据。在存储过程 无返回数据时可以不表明IN类型因为都是传入参数INOUT类型的参数即可以接受调用者传入的参数也可以向调用者返回数据。
有博客总结为数据库 SQL 语言层面的 一组经过预先编译的 代码封装与重用。
调用存储过程
调用存储过程如下例最后一行所示通过sumgrade返回检索结果。
DELIMITER //
CREATE PROCEDURE get_someone_sumgrade2(IN stuid int,OUT sumgrade int)
BEGINselect sum(grade) into sumgrade from score where stu_id stuid;
END //
DELIMITER ;SET sumgrade;
CALL get_someone_sumgrade2(901,sumgrade);
SELECT sumgrade ;无参数
有参数
该存储过程传入参数为sno有效性待验证。
存储过程为了防止定义重名第一行就先删除了重名的存储过程。存储过程的sql语句写在begin与end之间。存储过程将检索结果Sname存入name中并在最后通过select name;将检查结果返回。 请注意使用 select into 语句赋值的时候要确保该语句只返回一条结果或者加上 limit 1 来限制返回结果的行数。 drop procedure findname;
delimiter $$
create procedure findname(sno int)
begindeclare name varchar(10);select Sname into name from student where Snosno limit 1;select name;
end$$
delimiter ;在存储过程中使用 out 类型的参数输出省去了在最后通过select name;将检查结果返回该存储过程的定义如下所示。
drop procedure findname;
delimiter $$
create procedure findname(in sno int,out sname varchar(10))
beginselect Sname into sname from student where Snosno limit 1;
end$$
delimiter ;但是请注意承担返回结果的参数out sname varchar(10)也需要传入参数如下所示。
set name;
call findname(2,name);
select name as studentname;