昨天看了一篇介绍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)); } }
很简单吧。
上面的介绍到目前为知该结束了,本文系原创,转载请注明出处,谢谢。
全文完。
相关推荐
MySQL是一款广泛使用的开源关系型数据库管理系统,尤其在Java开发领域中有着重要的地位。这份"Mysql快速入门资料"针对初学者提供了全面的MySQL学习路径。在Java编程中,掌握MySQL是必要的,因为它允许开发者存储、...
本文从登录MySQL开始,介绍了数据库的基本操作、数据表的增删改查,再到存储过程的创建与使用,覆盖了MySQL从入门到精通的关键知识点。掌握这些内容,将使你在数据库管理和应用开发中更加得心应手。无论是作为PHP的...
内容概要:本文档提供了一个用于简单离散数学题库管理系统的设计与示例代码,详细介绍了基于Java的后端开发和利用MySQL存储数据的方法。文档涵盖了整个项目的基本构建方式,具体涉及了Maven依赖管理、数据库连接配置...
还有数据库驱动,例如`mysql-connector-java.jar`,因为示例需要本地安装MySQL,这意味着Activiti将使用MySQL作为其后台数据库存储流程定义和运行时数据。 示例工作流是学习Activiti的关键部分。它通常包括启动流程...
4. **使用步骤**:为了使用这个压缩包,你需要先解压,然后根据Java测试程序中的示例代码设置自己的数据库连接参数,确保它们与你的MySQL服务器配置相匹配。运行Java程序,如果一切正常,你应该能看到数据库连接成功...
压缩包中的“samples”目录可能包含了使用不同语言和框架(如ASP.NET、C#、Java和WinForm)与MySQL交互的示例代码。通过这些实例,你可以学习如何在实际项目中运用上述知识。 总结,MySQL 5权威指南涵盖了数据库的...
以下是一个简单的Java程序,演示了如何使用JDBC连接到MySQL数据库并执行SQL查询: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException...
"Java 入门入门入门入门入门入门入门入门"这个标题暗示了我们将要探讨的是针对初学者的基础知识,包括如何开始学习Java,理解其基本概念,以及如何编写简单的程序。 Java的基础知识点主要包括以下几个部分: 1. **...
在本入门示例中,我们将使用MyBatis 3.2.3版本,结合MySQL数据库进行基本操作。MySQL数据库的测试库名为"test"。 首先,让我们了解MyBatis的核心概念: 1. **配置文件**:MyBatis的主配置文件(mybatis-config.xml...
MySQL Connector/J 5.1.21 是一个用于Java应用程序的MySQL数据库驱动程序,它提供了与MySQL服务器交互的能力。这个zip文件包含了驱动的所有必要组件,使得开发者能够在Java平台上轻松地连接到MySQL数据库,执行SQL...
标题中的"chm php mysql java"表明这是一个涵盖了多种IT技术的资源集合,主要涉及CHM(Compiled Help Manual)格式的文档以及PHP、MySQL和Java这三种编程语言的学习资料和代码示例。描述中提到的“其中包括了mysql ...
本教程将帮助初学者了解如何使用Python与MySQL进行交互,实现数据的存储和检索。 首先,让我们从MySQL入门基础教程开始。这个教程会涵盖以下内容: 1. **安装MySQL**:讲解如何在不同的操作系统(如Windows、macOS...
这个入门示例展示了如何简单地实现CRUD功能,但Ibatis的功能远不止这些,它还支持存储过程、结果集映射、自定义类型处理器等多种高级特性,使得数据库操作更加灵活和高效。在实际项目中,根据需求和团队习惯,选择...
### MySQL新手入门知识点概要 #### 数据库发展史与阶段划分 - **人工管理阶段**:数据不保存,由应用程序自身负责数据管理,无文件概念,数据无法共享。 - **文件系统阶段**:数据可长期保存,通过文件系统管理数据...
7. **连接MySQL**:在Java中,我们通常使用JDBC(Java Database Connectivity)来与MySQL通信。JDBC提供了API,可以执行SQL语句、处理结果集等。 8. **JDBC基本步骤**:(1) 加载驱动,(2) 建立连接,(3) 创建...
这个“JSP+JavaBean+MySQL实现登陆及增删改查示例”是一个适合初学者入门的实践项目,它涵盖了网页交互、后端数据处理以及数据库操作的基本概念和方法。 首先,JSP是一种服务器端脚本语言,用于生成动态HTML页面。...
### 六、免安装MySQL的配置与使用 - **步骤**: 1. 解压软件包。 2. 创建并编辑`my.ini`文件。 3. 设置MySQL服务。 4. 配置系统Path变量。 5. 启动和关闭服务。 #### 示例配置 ```ini [mysqld] basedir=c:/...
JDBC的学习不仅仅局限于这些基本操作,还包括批处理、预编译语句的使用、存储过程的调用、连接池的管理等高级主题。在实际开发中,为了提高性能和代码可维护性,常常会结合使用DataSource、Connection Pooling(如C3...
3. **bbs论坛jsp_mysql**:指论坛使用JSP与MySQL的组合技术,JSP处理动态内容,MySQL处理数据存储。 4. **java_mysql**:表明后端数据库使用的是MySQL,它是开源、免费的关系型数据库管理系统,常用于Web应用。 5. *...