mysql------存储过程

数据库中的存储过程


存储过程

1、概念

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

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

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

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

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


2、优点

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

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

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


定义(可空参):create procedure 过程名(参数)

begin

多条sql语句

end

调用:call 过程名(实参)

另外,还要在写create之前写一句delimiter的语句,如delimiter $$,将默认的结束语句" ; "更换为"$$",防止在存储过程中定义的分号被看成结束语句直接提交。最后在end之后再将其还原成默认的" ; "即可,也是使用delimiter,如delimiter ;

实现代码:

delimiter $$
create procedure p1()
begin
  insert into stud values('P0010','小李',23);
  select * from stud;
end$$
delimiter ;

call p1();

带参数:

delimiter $$
create procedure p2( in id varchar(32), in nm varchar(30), in age int )
begin
   insert into stud values(id,nm,age);
   select * from stud;
end$$
delimiter ;

call p2('P011','小五',28);

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

delimiter $$
create procedure p3( in id varchar(32), in nm varchar(30), in age int, out num int )
begin
   insert into stud values(id,nm,age);
   select * from stud;
   select count(*) into num from stud;
end$$
delimiter ;

CALL p3('P012','小小五',27, @aa); /*调用且用aa接收结果*/

SELECT @aa;  /*显示用户变量aa*/
系统变量名称:@@变量名
用户变量名称:@变量名


Java实现存储过程

package cn.hncu.demo;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Types;

import org.junit.Test;

import cn.hncu.utils.ConnectionFactory;
/*
 * 演示在java中执行存储过程
 */
public class StoredProcedureDemo {
	@Test //不带参数
	public void callProcedureDemo() throws Exception{
		Connection conn=ConnectionFactory.getConnection();
		String sql="call f1()";
		CallableStatement cs=conn.prepareCall(sql);
		ResultSet rs=cs.executeQuery();
		while (rs.next()){
			System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getInt(3));
		}
	}
	@Test //不带参数
	public void callProcedureDemo2() throws Exception{
		Connection conn=ConnectionFactory.getConnection();
		String sql="call f3(?,?,?)";
		CallableStatement cs=conn.prepareCall(sql);
		cs.setString(1, "p011");
		cs.setString(2, "宋江");
		cs.setInt(3, 52);
		ResultSet rs=cs.executeQuery();
		while (rs.next()){
			System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getInt(3));
		}
	}
	@Test //带输入输出参数-----第4个参数 是 输出参数
	public void callProcedureDemo3() throws Exception{
		Connection conn=ConnectionFactory.getConnection();
		String sql="call f2(?,?,?,?)";
		CallableStatement cs=conn.prepareCall(sql);
		cs.setString(1, "p012");
		cs.setString(2, "李逵");
		cs.setInt(3, 44);
		cs.registerOutParameter(4, Types.INTEGER);
		cs.execute();
		int count=cs.getInt(4);
		System.out.println(count);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值