mysql ------ 存储过程

数据库中的存储过程


一、存储过程

1、概念

1)以一个名字存储在数据库中的,经过预编译的,为完成特定功能的sql语句集合

2)可以独立执行或通过应用程序调用,而且允许用户声明变量

3)一旦创建,在服务器即被编译,可在需要时使用多次

4)支持过程嵌套,且可以接受和输出参数、返回执行存储过程的状态值

5)是由控制流和sql语句书写的过程


2、优点

1)存储过程只在创造时进行编译,以后每次执行存储过程都不需要重新编译,而一般的sql语句不可以这样,一次一编,所以可以提高数据库的执行速度

2)重复使用,可减少数据库开发人员的工作量

3)设定只有某些用户才具有对指定存储过程的使用权,提高安全性


二、定义存储过程p1 // “DELIMITER$$”这句是为了让解析器把“$$”当作结束标志(否则默认是把“;“号当作结束标记),这样存储过程中的语句结束符";"就不会

当作过程的结束标记。

<span style="font-size:18px;">DELIMITER$$
CREATE PROCEDURE p1()
BEGIN
   SELECT * FROM stud;
   INSERT INTO stud(id,sname,age,score,dept) VALUES(1014,'刘三丰',33,55,'通信学院');
END$$
DELIMITER;   //把结束标记还原回来


CALL p1();  //调用存储过程p1</span>
java中实现代码
<span style="font-size:18px;">@Test
	public void testCall() throws Exception{
		Connection con = ConnFactory.getConn();
		CallableStatement cs =con.prepareCall("call pp1()");//封装存储过程的调用语句
		ResultSet rs = cs.executeQuery();//真正的执行
		while(rs.next()){
			System.out.println(rs.getString("sname"));
		}
		con.close();
	}</span>


三、带参数的存储过程

<span style="font-size:18px;">DELIMITER$$
CREATE PROCEDURE p2(IN id INT, IN nm VARCHAR(30) )
BEGIN
   INSERT INTO stud(id,sname) VALUES(id,nm);
END$$
DELIMITER ; 


DROP PROCEDURE p2;
CALL p2(1015,'吊丝');</span>
java中实现代码
<span style="font-size:18px;">@Test //带参数
	public void testCall2() throws Exception{
		Connection con = ConnFactory.getConn();
		//CallableStatement cs =con.prepareCall("call p2(1017,'lusy')");//封装存储过程的调用语句
		CallableStatement cs =con.prepareCall("call p2(?,?)");//带占位符封装存储过程的调用语句
		cs.setInt(1, 1018);
		cs.setString(2, "上海");
		cs.executeUpdate();
		con.close();
	}</span>


四、有返回值的存储过程----参数与变量问题( @变量名  ,一个@为用户变量,两个@即 @@为全局的系统变量 )

<span style="font-size:18px;">DELIMITER$$
CREATE PROCEDURE p3(IN id INT, IN nm VARCHAR(30), OUT num INT )
BEGIN
   INSERT INTO stud(id,sname) VALUES(id,nm);
   SELECT COUNT(*) INTO num FROM stud;
END$$
DELIMITER ; 
CALL p3(1016,'无名',@aa);
SELECT @aa; //输出变量aa的值</span>
java中实现代码

<span style="font-size:18px;">@Test //带参数,并接收返回值
	public void testCall3() throws Exception{
		Connection con = ConnFactory.getConn();
		CallableStatement cs =con.prepareCall("call p3(?,?,?)");//带占位符封装存储过程的调用语句
		cs.setInt(1, 1020);
		cs.setString(2, "益阳3");
		cs.registerOutParameter(3, Types.INTEGER);
		//cs.executeUpdate();
		cs.execute();//该方式下的存储过程当中可以使用任意sql操作
		int num = cs.getInt(3);
		System.out.println("返回结果:"+num);
		con.close();
	}</span>




















  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值