首先说一下什么叫存储过程。个人认为存储过程的作用就像java中封装的一个方法。
如果我们需要频繁执行一个复杂的sql语句,我们只需要将该sql语句写进一个存储过程,再执行该存储过程即可。
而存储过程就是将sql封装起来后使用它只需要调用而不需要再次编译。
存储过程的详解网上有许许多多的文章,并且说的都不错,这里不再过多叙述(注:你用的什么数据库,根据这个数据库查对应的存储过程语法)。
在这里我说一下许多新手第一次在mysql用存储过程可能会遇到的一些问题。
创建存储过程,大多数教程中会让你这样创建:
CREATE PROCEDURE demo()
BEGIN
SELECT NOW() FROM DUAL;
END;
这么创建在有些数据库中是没问题的(如oracle),但是有些新人用该存储过程语句在mysql执行发现会报以下错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
这是因为mysql默认以分号作为sql语句的结束来进行执行。因此内部的sql语句的";"和存储过程结束语end后的";"冲突,会导致编译错误。
因此需要临时定义一个新的分隔符(大多数用"//"和"$$"来定义)以区分sql和end后的分隔符的区别,这样只有收到新定义的分隔符才认为指令结束可以执行。
新的分隔符用DELIMITER来定义
因此,mysql应该这样创建存储过程:
DELIMITER //
CREATE PROCEDURE demo()
BEGIN
SELECT NOW() FROM DUAL;
END//
为了防止定义的存储过程名重复导致存储过程创建失败,一般前面还要先删除存在的存储过程:
DROP PROCEDURE IF EXISTS demo;
DELIMITER //
CREATE PROCEDURE demo()
BEGIN
SELECT NOW() FROM DUAL;
END//
上面说过,存储过程其实类似一个java方法,想要实现方法里的功能需要先调用该方法。因此如果你想执行存储过程里的sql语句,你还需要通过call命令来执行存储过程。
CALL demo();
我刚接触存储过程的时候,创建了存储过程后发现里面的sql无论如何都执行不了,后来一了解才知道原来是我没有执行它,非常低级的一个错误!!!
存储过程的用处与弊端:
存储过程一般用于个别对性能要求较高的业务,还有在mysql数据库中实现事务。
而不同数据库,语法差别很大,移植困难,不利于分层管理,把过多业务逻辑写在存储过程不好维护,这是它的弊端
因此其它时候存储过程的必要性不是很大,少用。