MySql存储过程

来源:互联网 发布:照片视频软件 编辑:程序博客网 时间:2024/06/10 23:23

今天终于接触到数据库存储过程这个神奇的东西了,数据库存储过程是一个为了提高数据库查询性能而产生的一个产品,存储过程其实是一个数据集,它一经生成,便可以永久的存在数据库,当第一次调用的时候,存储过程会把数据暂时保存在一个缓存里面,当第二次调用的时候,数据库直接从缓存里面拿数据,而不是在数据库里面拿数据,这样就避免了用户频繁向数据库里面查询数据,大大节省了资源,并且大大提高了效率。


在数据库里面建立存储过程也很简单。

下面是一个参考例子:

DROP PROCEDURE
IF EXISTS students;


delimiter //
CREATE PROCEDURE students (id VARCHAR(255))
BEGIN
SELECT
a.*
FROM
student AS a
WHERE
a.id = id ;
END//

第一个部分的意思是检查数据库里面是否已经存在该存储过程了,如果存在,删除,这个语句非常好用,在数据库查询的其他地方也经常使用。

delimiter 是一个关键字,生命存储过程运行和结束的标志,这里是以双斜杠//标志,当然,也可以选用其他的标点符号例如$、,等进行标志。

MySql建立存储过程的语法跟其他数据库的有很大的区别,在这里要特别注意一下。声明的变量必须包含在括号里面,里面的参数有三种类型,一般是in、

out、或者inout,在三个类型的参数基本的功能都是传递参数,但是,他们在查询体里面的变化却不一样,in的话经过了查询体初始值不会改变,后面两个都会改变,

也可以定义多个参数,用逗号隔开。


调用存储过程也非常简单,而且很方便,原生的jdbc跟hebernate都支持存储过程的查询,不过总的来说还是利用hebernate的SQL查询最方便。

下面先列出一个SQL查询的java例子:

@Override
public List<Student> getAllByProcedure() {
String sql="call students(?);";
SQLQuery query=getSession().createSQLQuery(sql).addEntity(Student.class);
query.setString(0,"s");
List<Student> list=query.list();
return list;
}

注意,传递参数的位置要从0开始。

如果要直接查询的话,用一条语句就可以搞定:

call students('s');

如果有多个参数的话,同样是用逗号隔开。

另外还用一些存储过程的特定命令,用起来很有趣:

查看某个数据库的存储过程:

show procedure status where Db='test';

查看所有数据库的话使用命令:

show procedure status;

另外还有一个非常有趣的例子,利用存储过程计算数据输入输出:

create procedure pr_add

(

   a int,

   b int

)

begin

   declare c int;

   if a is null then

      set a = 0;

   end if;

   if b is null then

      set b = 0;

   end if;

   set c = a + b;

   select c as sum;

end;

总的来说,存储过程这东西很好玩,玩一下就知道了!!
0 0