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

}

相关推荐