一,存储过程是什么
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。(因为我所在的公司是并发式开发,存储过程经常用到)
二,存储过程有什么用
存储过程真的那么重要吗,它到底有什么好处呢?
- 存储过程说白了就是一堆 SQL 的合并。中间加了点逻辑控制。写一点简单的逻辑 ,但是又不能太多,所以一般是数据的新增和修改【判断id的条件 去执行新增或者修改最适合不过】。
- 数据量小的,或者和钱没关系的项目不用存储过程也可以正常运作。
2.存储过程处理比较复杂的业务时比较实用。具体分为两个方面:
(一)、响应时间上来说有优势:如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话,就只有一次。存储过程可以给我们带来运行效率提高的好处;
(二)、从安全上使用了存储过程的系统更加稳定:程序容易出现 BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。
三、那么什么时候才可以用存储?
存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。其威力和优势主要体现在:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
5.更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。
6.布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。
一般来说,存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。经自已测试,一个有着十万条记录的表,通过php调用存储过程比通过PHP执行sql语句获取所有记录的时间,平均快0.4秒左右.
下面给大家实例个新增修改的存储过程
DELIMITER $$
USE `dbolav2`$$ -- 用哪个数据库
DROP PROCEDURE IF EXISTS `SP_Trecruitmentmachinist`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_Trecruitmentmachinist`( -- 创建一个存储过程
/*在存储过程中定义数据库字段接收 */
p_id INT, p_recruitmentTitle VARCHAR(128), p_vehicleDescription VARCHAR(512),
p_workArea VARCHAR(128), p_remuneration DECIMAL(11,2), p_releaseInstructions VARCHAR(128),
p_userId INT, p_releaseUser VARCHAR(32), p_releaseContact VARCHAR(32),
p_postStatus INT, p_releaseTime DATETIME, p_releaseSerialNumber INT,
p_serialTime DATETIME
)
lbl_pro:BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION -- 为SQLEXCEPTION声明退出处理程序
BEGIN
ROLLBACK; -- 事务回滚
-- SELECT -1 AS activ_id, '' AS activ_subject;
END;
START TRANSACTION; -- 开启事务
IF p_id=0 THEN -- 如果id为0的话意味着没有这条数据
INSERT INTO t_recruitmentmachinist -- 那么下面就是在这张表里面新增
( /*数据库的字段*/
recruitmentTitle , vehicleDescription, workArea,
remuneration, releaseInstructions, userId,
releaseUser, releaseContact, postStatus,
releaseTime, releaseSerialNumber, serialTime
)
VALUES ( /*从方法里面传过来的值*/
p_recruitmentTitle, p_vehicleDescription, p_workArea,
p_remuneration, p_releaseInstructions, p_userId,
p_releaseUser, p_releaseContact, p_postStatus,
p_releaseTime, p_releaseSerialNumber, p_serialTime
);
SELECT @@IDENTITY INTO p_id ; -- 返回自动递增字段的值
ELSE
-- 不为0就说明有数据 为修改
UPDATE t_recruitmentmachinist SET
/*把数据库的字段值改为传过来的参数值*/
recruitmentTitle=p_recruitmentTitle, vehicleDescription=p_vehicleDescription, workArea=p_workArea,
remuneration=p_remuneration, releaseInstructions=p_releaseInstructions, userId=p_userId,
releaseUser=p_releaseUser, releaseContact=p_releaseContact, postStatus=p_postStatus,
releaseTime=p_releaseTime, releaseSerialNumber=p_releaseSerialNumber, serialTime=p_serialTime
WHERE id=p_id;
END IF;
COMMIT;
SELECT p_id AS `id`; -- 选择id作为p_id
END$$
DELIMITER ;