玩转MySQL———存储过程 V2

存储过程

定义:

create procedure 过程名(参数)

begin

多条sql语句

end

调用:

call 过程名(实参)

实例1--无参的存储过程:

△小细节:要把默认的语句结束“;”号改成其它如“$$”,这样存储过程中定义的分号就不被看成是语句结束(否则会直接被提交)

最后再把“;”号还原成默认的结束符

 

   delimiter $$

       create procedure p1()

       begin

          insert into stud values('P0010','小李',23);

          select * from stud;

      end$$

  delimiter ;

call p1();
 

实例2--有参的存储过程:

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);

实例3--有返回值的存储过程:

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*/

系统变量名称:@@变量名

用户变量名称:@变量名

//////////binary////////////////

mysql查询默认是不区分大小写的如:

select * from table_name where a like 'a%'

select * from table_name where a like 'A%'

效果是一样的。

要让mysql查询区分大小写,可以:

select * from table_name where binary a like 'a%'

select * from table_name where binary a like 'A%'

也可以在建表时,加以标识:

create table table_name(

a varchar(20) binary

)

这里补jdbc 操作存储过程的java代码:

演示Java中如何调用数据库中的存储过程:

1.调用存储过程得用CallableStatement。

2. 它和PreparedStatement类似,也是Statement的子类,也可把用户输入用

参数封装的方式防黑。

3. 即在父类的基础上增加了一些功能。

下面进行代码演示

1. 无参, 如 call p1();

@Test
	public void demo1() throws Exception {
		Connection con = ConnUtils.getConn();

		// ※※※调用存储过程得用 CallableStatement语句对象
		CallableStatement cs = con.prepareCall("call p1()");

		ResultSet rs = cs.executeQuery(); // 如果存储过程调用之后会有返回结果,则最好用executeQuery()
		while (rs.next()) {
			System.out.println(rs.getString("name"));
		}
		con.close();
	}

2. 有输入参, 如 call p2('P011','小五',28);

// 有输入参, 如 call p2('P011','小五',28);
	@Test
	public void demo2() throws Exception {
		Connection con = ConnUtils.getConn();

		// CallableStatement cs = con.prepareCall("call p2('P011','小五',28)");
		// //sql写死了
		CallableStatement cs = con.prepareCall("call p2(?,?,?)"); // sql写活
		cs.setString(1, "P201");
		cs.setString(2, "大王");
		cs.setInt(3, 45);

		ResultSet rs = cs.executeQuery(); // 如果存储过程调用之后会有返回结果,则最好用executeQuery()
		while (rs.next()) {
			System.out.println(rs.getString("name"));
		}
		con.close();
	}

3.有输入参和返回值, 如 CALL p3('P012','小小五',27, @aa);

// 有输入参和返回值, 如 CALL p3('P012','小小五',27, @aa);
	@Test
	public void demo3() throws Exception {
		Connection con = ConnUtils.getConn();

		CallableStatement cs = con.prepareCall("call p3(?,?,?,?)"); // 最后一个?号是用于输出参数的
		// 3个输入参数
		cs.setString(1, "P202");
		cs.setString(2, "大大王");
		cs.setInt(3, 55);

		// ※※注册一个返回类型的参数
		cs.registerOutParameter(4, Types.INTEGER); //把第4个问号注册成输出参数
		//cs.execute(), cs.executeUpdate()
		ResultSet rs = cs.executeQuery(); // 如果存储过程调用之后会有返回结果,则最好用executeQuery()
		while (rs.next()) {
			System.out.println(rs.getString("name"));
		}
		
		//※※
		int n = cs.getInt(4); //获取存储过程的返回值,之前已经把它注册到第4个点位符了
		System.out.println("n="+n);
		con.close();
	}

猜你喜欢

转载自blog.csdn.net/lx678111/article/details/82750757
v2
今日推荐