`
53873039oycg
  • 浏览: 826609 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Mysql简单存储过程入门示例与Java调用

阅读更多

     昨天看了一篇介绍Mysql存储过程博客,链接如下:

     http://my.oschina.net/u/1264926/blog/199831

     我试着运行了下,一直报错,找了很久才发现Mysql存储过程赋值要用SET 变量名 = 表达式值,很久没有Mysql存储过程,好多东西都忘光了,而是写了本篇博文备忘,我使用的数据库版本是Mysql 5.6.14,使用了Navicat Premium图形界面,首先是我参考的链接:

    

http://www.cnblogs.com/jevo/p/3271359.html
http://phpzf.blog.51cto.com/3011675/793775

    下面开始介绍Mysql存储过程,语法之类的我就不写了,请自行谷歌,我的存储过程是完成1到limit之间的累加和,所以要用到循环,Mysql存储过程常用的循环语句有:While,Loop,Repeat,下面一一介绍怎么写:

    (一)首先是使用While循环(WHILE……DO……END WHILE)

   

create procedure proc_mysql_getsum_bywhile(in v_limit int,out sum int)
begin
   declare i int default 0;
   set sum=0;
   while i<v_limit do
      begin
      set sum=sum+i;
      set i=i+1;
      end;
   end while;
   /**select sum;**/
end

    这里啰嗦一句,Mysql里面没有类似Oracle的DBMS_OUT.PUT_LINE之类的打印语句,想打印结果,请用select 变量。

   While循环测试:

   

set @limit=100;
set @out=0;
call proc_mysql_getsum_bywhile(@limit,@out);
select @out

   (二)repeat 循环(REPEAT……END REPEAT)

  

create procedure proc_mysql_getsum_byrepeat(in v_limit int,out sum int)
begin
   declare i int default 0;
   set sum=0;
   repeat 
      begin
      set sum=sum+i;
      set i=i+1;
       end;
      until i>v_limit
   end repeat;
   /**select sum;**/
end;

    Repeat测试:

   

set @limit=100;
set @out=0;
call proc_mysql_getsum_byrepeat(@limit,@out);
select @out

    (三)loop循环

   

create procedure proc_mysql_getsum_byloop(in v_limit int,out sum int)
begin
   declare i int default 0;
   set sum=0;
   loop_label:loop  
      begin
        set sum=sum+i;
        set i=i+1;
      if i>v_limit then 
            leave loop_label; 
       end if; 
       end;
   end loop;
   /**select sum;**/
end;

    loop 测试:

   

set @limit=100;
set @out=0;
call proc_mysql_getsum_byloop(@limit,@out);
select @out

    上面介绍的是一个简单的带输入输出的存储过程,下面在介绍一个getUserById的存储过程,和上面的差不多。

  

create procedure proc_mysql_inout_test(in v_id int,out username varchar(20))
begin
   select username into username from user_t2 where id = v_id; 
   /**select username;**/
end;

    in out参数测试:

    Navicat查询界面测试:

   

call proc_mysql_inout_test(2,@out);
select @out

    返回值很奇怪结果是Blob。

  

    Navicat命令行下测试:返回的是gbk编码的字符串,而直接select * from user_t2;无乱码,如下所示:

   

    cmd 命令行下测试 无乱码,如下所示:

   

    如果想在存储过程中执行sql语句该怎么写呢?请看示例:

    测试新建表并填充值:

   

drop PROCEDURE proc_mysql_createtb_insert_data;
CREATE PROCEDURE proc_mysql_createtb_insert_data(IN loop_times INT) 
BEGIN  
DECLARE var INT DEFAULT 0;  
PREPARE MSQL FROM 'CREATE TABLE IF NOT EXISTS mysql_employee (id INT (10)  NOT NULL AUTO_INCREMENT,empname VARCHAR (16) NOT NULL COMMENT ''名字'',hiredate TIMESTAMP DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id)) ENGINE = INNODB DEFAULT CHARSET = utf8';
EXECUTE MSQL;  
deallocate prepare MSQL; 
WHILE var<loop_times DO  
SET var=var+1;  
 insert into mysql_employee(empname) values 
  ((select substr(uuid(),1,15) from dual));
END WHILE;  
END 

    测试
   

call proc_mysql_createtb_insert_data(10);
select * from mysql_employee;

  

   Mysql存储过程想要修改时只能先删除在新建,删除方法为:

  

drop procedure proc_mysql_getsum_bywhile

   查看某个数据库下面的存储过程方法为:

  

select name from mysql.proc where db='test'

   如果想和Oracle存储过程一样返回游标,怎么写呢,很遗憾,我所知道的是Mysql不支持Out ref_cur cursor之类的写法的,你可以在存储过程中新建临时表,结束时候删除临时表,方法请参考上面的新建表示例。

   另一种方法是直接select 内容,不写返回结果,如下所示:

  

CREATE PROCEDURE proc_mysql_return_cursor_method() 
begin
select * from user_t2;
end;

    测试方法为:

   

call proc_mysql_return_cursor_method();

    下面我简单介绍下Java中怎么调用Mysql存储过程,如果不感兴趣可以不用往下看了。

    首先是公共方法:

   

public Connection getMysqlConnection() {
		String driver = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/test";// 要操作的数据库名称
		String username = "root";// 数据库用户名
		String password = "123";// 密码
		return getConnection(driver, url, username, password);
	}

	public Connection getConnection(String driver, String url, String userName,
			String passwd) {
		Connection conn = null;
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, userName, passwd);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

   我就以我写的while循环为例,输入int参数,输出int参数:

  

public void testMysqlProcedureRtnInt(Connection con, CallableStatement cs,
			int limit) throws Exception {
		cs = con.prepareCall("{call proc_mysql_getsum_bywhile(?,?)}");
		// 设置参数
		cs.setInt(1, limit);
		// 注册输出参数
		cs.registerOutParameter(2, oracle.jdbc.OracleTypes.INTEGER);
		// 执行过程
		cs.execute();
		// 获取结果
		int result = cs.getInt(2);
		System.out.println("结果为:" + result);
	}

   输入int,输出varchar类型方法类似:

  

public void testMysqlProcedureRtnVarchar(Connection con,
			CallableStatement cs, int id) throws Exception {
		cs = con.prepareCall("{call proc_mysql_inout_test(?,?)}");
		// 设置参数
		cs.setInt(1, id);
		// 注册输出参数
		cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
		// 执行过程
		cs.execute();
		// 获取结果
		String result = cs.getString(2);
		System.out.println("结果为:" + result);
	}

    来看下返回类似游标类型的调用:

   

public void testMysqlProcedureRtnCursor(Connection con,
			CallableStatement cs, ResultSet rs) throws Exception {
		cs = con.prepareCall("{call proc_mysql_return_cursor_method()}");
		// 执行过程
		rs = cs.executeQuery();
		System.out.println("id" + "\t" + "username" + "\t" + "passwd");
		while (rs.next()) {
			System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t"
					+ rs.getString(3));
		}
	}

    很简单吧。

    上面的介绍到目前为知该结束了,本文系原创,转载请注明出处,谢谢。

     全文完。

  

   

  • 大小: 19.6 KB
  • 大小: 112.2 KB
  • 大小: 51.6 KB
分享到:
评论

相关推荐

    MySQL 5权威指南(第3版) 中文版 下载地址

    主要内容包括MySQL、PHP、Apache、Perl等组件的安装与功能简介,mysql等一些重要系统管理工具和用户操作界面的使用,MySQL数据库系统设计的基础知识与用不同语言设计MySQL数据库的过程,以及SQL语法、工具、选项、...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    MySQL5 权威指南第3版中文版_part1

    主要内容包括MySQL、PHP、Apache、Perl等组件的安装与功能简介,mysql等一些重要系统管理工具和用户操作界面的使用,MySQL数据库系统设计的基础知识与用不同语言设计MySQL数据库的过程,以及SQL语法、工具、选项、...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    spring-boot示例项目

    jGit|[java调用git命令、jgit使用等](https://github.com/smltq/spring-boot-demo/blob/master/jGit) webmagic|[webmagic实现某电影网站爬虫示例](https://github.com/smltq/spring-boot-demo/blob/master/webmagic...

    azure-examples:Azure Java示例

    Azure Java示例该GitHub存储库包含一组Azure示例,这些示例专门供Java用户快速入门。 请使用问题跟踪器留下反馈或提出其他示例。入门要使用这些示例,假定您已经安装了Azure CLI,并且已经登录并设置了默认订阅。 ...

    Activiti6.0教程例子下载

    3. 入门示例(参考手册中10分钟教程) 3.1. 概述 下面开始编写一个示例。这个Demo为一个“月度报表申请”流程。由“sales(销售)”组的用户制作月度报表,提交给“management(经理)”组的用户,经理审批该报表,...

    asp.net知识库

    也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息...

    派克特

    该应用程序使用Java运行并在Mysql DB中存储数据。 入门 这些说明将为您提供在本地计算机上运行并运行的项目的副本,以进行开发和测试。 有关如何在实时系统上部署项目的注释,请参阅部署。 先决条件 您需要什么东西...

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    Spring-Boot-Application-Template:Spring Boot Web应用程序,Flyway,MySQL,H2DB,Bootstrap,Thymeleaf,JWT,Swagger,API速率限制,Docker,RBAC,i18n

    Spring Boot应用程序模板/入门项目 比Maven原型更好的唯一事情是... -与一些最广泛使用CSS框架集成的扩展表。 适用于Web和独立环境的现代服务器端Java模板引擎。 服务器-后端 -Java:trade_mark:平台,标准版开发套

    spring security 参考手册中文版

    13.5与其他基于过滤器的框架一起使用 118 13.6高级命名空间配置 118 14.核心安全筛选器 119 14.1 FilterSecurityInterceptor 119 14.2 ExceptionTranslationFilter 121 14.2.1 AuthenticationEntryPoint 122 14.2.2 ...

    单点登录源码

    └── zheng-demo -- 示例模块(包含一些示例代码等) ├── zheng-demo-rpc-api -- rpc接口包 ├── zheng-demo-rpc-service -- rpc服务提供者 └── zheng-demo-web -- 演示示例[端口:8888] ``` ### 技术...

Global site tag (gtag.js) - Google Analytics