Home > Database > Mysql Tutorial > MySQL存储过程以及在Java中的程序调用

MySQL存储过程以及在Java中的程序调用

WBOY
Release: 2016-06-07 15:21:39
Original
987 people have browsed it

存储过程是一种存储在数据库中的程序(就像正规语言里的子程序一样),准确的来说,MySQL支持的ldquo;routines(例程)rdquo;有

存储过程是一种存储在数据库中的程序(就像正规语言里的子程序一样),准确的来说,MySQL支持的“routines(例程)”有两种:一是我们说的存储过程, 二是在其他SQL语句中可以返回值的函数(使用起来和Mysql预装载的函数一样,如pi())。本文是为初学习MySQL存储过程的朋友写的,在本文中我们以在MySQL的CLI(command line interface)中建立一个存储过程的示例开始,然后通过在Java程序中调用我们创建好的存储过程,让读者对MySQL的存储过程有个大概的了解和入门。

MySQL存储过程及Java中存储过程的调用 

一、创建MySQL存储过程示例

下面是具体的创建过程:

--启动MySQL服务
C:/Documents and Settings/Zengming Zhang>net start mysql

MySQL 服务已经启动成功。

--登录MySQL控制台
C:/Documents and Settings/Zengming Zhang>mysql -u root -p
Enter password: **********
Welcome to the MySQL monitor.  Commands end with ; or /g.
Your MySQL connection id is 1 to server version: 5.0.18-nt

Type 'help;' or '/h' for help. Type '/c' to clear the buffer.

--选择数据库
mysql> use test;
Database changed

--创建示例用表
mysql> create table zzm(
    -> id int primary key auto_increment,
    -> name varchar(10)
    -> );
Query OK, 0 rows affected (0.20 sec)
mysql> insert into zzm(name) values('zhang');
Query OK, 1 row affected (0.08 sec)

mysql> insert into zzm(name) values('zeng');
Query OK, 1 row affected (0.05 sec)

mysql> insert into zzm(name) values('ming');
Query OK, 1 row affected (0.05 sec)

mysql> select * from zzm;
+----+-------+
| id | name  |
+----+-------+
|  1 | zhang |
|  2 | zeng  |
|  3 | ming  |
+----+-------+
3 rows in set (0.00 sec)

--更改命令结束符(因为在procedure中经常要用到默认的命令结束符--分号(;)
--所以在创建procedure的时候需要定义新的结束符以说明创建procedure的命令结束)
--这里将结束符号改成美元符号--$
mysql> delimiter $

--创建存储过程p3
--此存储过程的过程名是p3,该过程包含两个参数,
--一个是输入类型的(以IN标示),参数名是nameid,类型是int,
--一个是输出类型的(以OUT标示),参数名是person_name,类型是varchar(10)
--此存储过程的作用是查询出zzm表的全部内容,会输出结果集(data set),然后
--再查询表中记录的ID是nameid的字段name,将其输出到第二个输出类型的参数里面,这个查询
--不会输出结果集。
mysql> create procedure p3(IN nameid int, OUT person_name varchar(10))
    -> begin
    -> select * from test.zzm;
    -> select zzm.name into person_name from test.zzm where zzm.id = nameid;
    -> end
    -> $
Query OK, 0 rows affected (0.00 sec)

--创建完成,查看数据库中所有已经创建的存储过程
mysql> show procedure status $
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
| Db  | Name | Type      | Definer        | Modified            | Created            | Security_type | Comment |
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
| test | p3  | PROCEDURE | root@localhost | 2009-08-18 16:40:21 | 2009-08-18 16:40:21 | DEFINER      |        |
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
1 row in set (0.02 sec)

--调用存储过程
mysql> call p3(3,@name) $
+----+-------+
| id | name  |
+----+-------+
|  1 | zhang |
|  2 | zeng  |
|  3 | ming  |
+----+-------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @name $
+-------+
| @name |
+-------+
| ming  |
+-------+
1 row in set (0.00 sec)

二、在Java程序中调用存储过程的程序示例

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

public class Main {

 public static void main(String[] args) {
  /* JDBC连接MySQL数据库的参数 */
  String driverName = "com.mysql.jdbc.Driver";
  String userName = "root";
  String userPasswd = "nicegiving";
  String dbName = "test";
  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(?,?)}");
  // 第一个参数是输入的,在此设置第一个参数的值:将第一个参数设置成整数值3
  stmt.setInt(1, 3);
  // 第二个参数是输出的,在此设置第二个参数的输出类型为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());
  }
  }
 }

}

--程序执行结果--
Data from table:
ID = 1 Name = zhang
ID = 2 Name = zeng
ID = 3 Name = ming

Data from procedure:
Name = ming

三、总结

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template