MySQL存储过程 AND 在JAVA中的程序调用
一、创建MySQL存储过程示例
下面是具体的创建过程:
viewplaincopytoclipboardprint?
--启动MySQL服务
C:/DocumentsandSettings/ZengmingZhang>netstartmysql
MySQL服务已经启动成功。
--登录MySQL控制台
C:/DocumentsandSettings/ZengmingZhang>mysql-uroot-p
Enterpassword:**********
WelcometotheMySQLmonitor.Commandsendwith;or/g.
YourMySQLconnectionidis1toserverversion:5.0.18-nt
Type'help;'or'/h'forhelp.Type'/c'toclearthebuffer.
--选择数据库
mysql>usetest;
Databasechanged
--创建示例用表
mysql>createtablezzm(
->idintprimarykeyauto_increment,
->namevarchar(10)
->);
QueryOK,0rowsaffected(0.20sec)
mysql>insertintozzm(name)values('zhang');
QueryOK,1rowaffected(0.08sec)
mysql>insertintozzm(name)values('zeng');
QueryOK,1rowaffected(0.05sec)
mysql>insertintozzm(name)values('ming');
QueryOK,1rowaffected(0.05sec)
mysql>select*fromzzm;
+----+-------+
|id|name|
+----+-------+
|1|zhang|
|2|zeng|
|3|ming|
+----+-------+
3rowsinset(0.00sec)
--更改命令结束符(因为在procedure中经常要用到默认的命令结束符--分号(;)
--所以在创建procedure的时候需要定义新的结束符以说明创建procedure的命令结束)
--这里将结束符号改成美元符号--$
mysql>delimiter$
--创建存储过程p3
--此存储过程的过程名是p3,该过程包含两个参数,
--一个是输入类型的(以IN标示),参数名是nameid,类型是int,
--一个是输出类型的(以OUT标示),参数名是person_name,类型是varchar(10)
--此存储过程的作用是查询出zzm表的全部内容,会输出结果集(dataset),然后
--再查询表中记录的ID是nameid的字段name,将其输出到第二个输出类型的参数里面,这个查询
--不会输出结果集。
mysql>createprocedurep3(INnameidint,OUTperson_namevarchar(10))
->begin
->select*fromtest.zzm;
->selectzzm.nameintoperson_namefromtest.zzmwherezzm.id=nameid;
->end
->$
QueryOK,0rowsaffected(0.00sec)
--创建完成,查看数据库中所有已经创建的存储过程
mysql>showprocedurestatus$
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
|Db|Name|Type|Definer|Modified|Created|Security_type|Comment|
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
|test|p3|PROCEDURE|root@localhost|2009-08-1816:40:21|2009-08-1816:40:21|DEFINER||
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
1rowinset(0.02sec)
--调用存储过程
mysql>callp3(3,@name)$
+----+-------+
|id|name|
+----+-------+
|1|zhang|
|2|zeng|
|3|ming|
+----+-------+
3rowsinset(0.00sec)
QueryOK,0rowsaffected(0.00sec)
mysql>select@name$
+-------+
|@name|
+-------+
|ming|
+-------+
1rowinset(0.00sec)
package com.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Types; public class Connect { public static void main(String[] args) { /* JDBC连接MySQL数据库的参数 */ String driverName = "com.mysql.jdbc.Driver"; String userName = "root"; String userPasswd = "admin"; String dbName = "stopro"; String url = "jdbc:mysql://localhost/" + dbName + "?user=" + userName + "&password=" + userPasswd; Connection connection = null; CallableStatement stmt = null; try { // 加载数据库驱动程序 Class.forName(driverName).newInstance(); // 连接数据库 connection = DriverManager.getConnection(url); // 调用存储过程,此存储过程有2个参数 stmt = connection.prepareCall("{call p3(?,?)}"); // 第一个参数是输入的,在此设置第一个参数的值:将第一个参数设置成整数值1 stmt.setInt(1, 1); // 第二个参数是输出的,在此设置第二个参数的输出类型为VARCHAR stmt.registerOutParameter(2, Types.VARCHAR); // 执行存储过程 boolean hadResults = stmt.execute(); // 如果有查询语句的话,此执行过程会返回结果集,在此处理结果集里面的东西 System.out.println("Data from table:"); while (hadResults) { ResultSet rs = stmt.getResultSet(); while(rs.next()){ String id = rs.getString(1); String name = rs.getString(2); System.out.println("ID = "+id+"\tName = " + name); } hadResults = stmt.getMoreResults(); } // 获取存储过程的返回值 System.out.println("\nData from procedure:"); String name = stmt.getString(2); // 获得第二个参数,因为第二个参数是输出类型的 System.out.println("Name = " + name); } catch (Exception e) { System.out.println(e.toString()); } finally { try { stmt.close(); connection.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } } } }