《mysql JDBC 调用存储过程》要点: 本文介绍了mysql JDBC 调用存储过程,希望对您有用。如果有疑问,可以联系我们。
与oracle不同,mysql不支持匿名块,如果需要写过程语句,则必需定义存储过程.如果你会oracle的存储过程,那么mysql的存储过程也很简单了. 一.创建存储过程 create procedure sp_name() begin ......... end 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必需加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法: drop procedure sp_name// 2.注意事项 (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 四.其他常用命令 1.show procedure status 显示数据库中所有存储的存储过程基本信息,包含所属数据库,存储过程名称,创建时间等 2.show create procedure sp_name 显示某一个MySQL存储过程的详细信息 下面来几个实例吧: CREATE DATABASE `test`; USE `test`; CREATE TABLE `fruit` ( `id` char(36) NOTNULL COMMENT '标识', `name` varchar(12) NOTNULL COMMENT '名称', `price` decimal(8,2) NOTNULL COMMENT '单价', `address` varchar(300) DEFAULTNULL COMMENT '产地', PRIMARYKEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='水果表'; insertinto `fruit`(`id`,`name`,`price`,`address`) values ('27640c30-8df5-4cf2-916e-c28e0b2b1b52','山竹','24.45','马来西亚'), ('46ac8392-9922-4593-89a3-517a9e516733','菠萝','19.41','巴西'), ('63061a9f-3a0e-4140-98e0-8b1e13e4eab3','哈密瓜','17.77','中国'), ('7ef0c286-b8b1-4e1e-9a8a-36bce703cf18','鳄梨','30.80','墨西哥'), ('a1cf5251-9311-4c7f-be10-3532d8c16291','树莓','117.50','瑞士'), ('c397aed0-a39a-49c5-91ee-7fc0579ddb20','莲雾','77.33','印度尼西亚'), ('e8068fa1-a8e7-4025-89e2-36c1d5d23c74','榴莲','16.50','泰国');
创建存储过程: 1 没有任何输入和输出参数的存储过程 DELIMITER $$ //这里可能有些看不懂,没关系,文章最后附录有详细说明. CREATE PROCEDURE noParam() BEGIN SELECT AVG(price) AS priceAvg FROM fruit; END$$ DELIMITER ; JDBC代码: /** * 没有任何输入和输出参数的存储过程 * * @author GaoHuanjie */ publicclass NoParam { publicstaticvoid main(String args[]) throws SQLException { Connection connection = LinkDB.getMySqlConnection(); String proStr = "{call noParam}"; CallableStatement callableStatement = connection.prepareCall(proStr); callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); while (resultSet.next()) { System.out.println("产品的平均价格是:" + resultSet.getDouble("priceAvg") + "元"); } LinkDB.close(connection,callableStatement,resultSet); } }
2、只有两个输入参数的存储过程 DELIMITER $$ CREATE PROCEDURE inTwoParam(IN fruitName VARCHAR(12),IN fruitPrice DECIMAL(9,2)) BEGIN //注意:CONCAT('%',fruitName,'%')不能为'%'+fruitName+'%' SELECT * FROM fruit WHERE NAME LIKE CONCAT('%','%') AND price < fruitPrice; END$$ DELIMITER ; /** * 只有两个输入参数的存储过程 * * @author GaoHuanjie */ publicclass InTwoParam { publicstaticvoid main(String args[]) throws SQLException { Connection connection = LinkDB.getMySqlConnection(); String procStr = "{call inTwoParam(?,?)}"; CallableStatement callableStatement = connection.prepareCall(procStr); callableStatement.setString(1,"莲"); callableStatement.setDouble(2,88.88);//对DECIMAL类型的属性设值要使用setDouble办法. callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); System.out.println("名称包括‘莲’字且价格小于88.88元的水果有:"); while (resultSet.next()) { System.err.println("名称:" + resultSet.getString("name") +"、价格:" + resultSet.getDouble("price") + "元"+"、产地:" + resultSet.getString("address")); } LinkDB.close(connection,resultSet); } }
3、只有两个输出参数的存储过程 DELIMITER $$ CREATE PROCEDURE outTwoParam(OUT fruitName VARCHAR(12),OUT fruitPrice DECIMAL(5,3) ) BEGIN SELECT name INTO fruitName FROM fruit WHERE name='莲雾'; SELECT price INTO fruitPrice FROM fruit WHERE NAME='莲雾'; END $$ DELIMITER ; 注意:上面两条查询语句不能合成一个SQL语句——SELECT NAME INTO fruitName,price INTO fruitPrice FROM fruit WHERE NAME='莲雾'; /** * 只有两个输出参数的存储过程 * * @author GaoHuanjie */ publicclass OutTwoParam { publicstaticvoid main(String args[]) throws SQLException { Connection connection = LinkDB.getMySqlConnection(); String proStr = "{call outTwoParam(?,?)}"; CallableStatement callableStatement = connection.prepareCall(proStr); callableStatement.registerOutParameter(1,Types.VARCHAR); callableStatement.registerOutParameter(2,Types.DECIMAL); callableStatement.execute(); String fruitName = callableStatement.getString(1); double fruitPrice = callableStatement.getDouble(2);// 获取DECIMAL类型的属性要使用getDouble办法. System.out.println("水果名称:" + fruitName +"、水果价格:" + fruitPrice + "元"); LinkDB.close(connection,null); } }
4、含有一个输入参数和一个输出参数的存储过程 DELIMITER $$ CREATE PROCEDURE inOneParamAndOutOneParam(IN fruitName VARCHAR(12),OUT fruitPrice DECIMAL(7,3)) BEGIN SELECT price FROM fruit WHERE NAME=fruitName INTO fruitPrice; END $$ DELIMITER ; /** * 含有一个输入参数和一个输出参数的存储过程 * * @author GaoHuanjie */ publicclass InOneParamAndOutOneParam { publicstaticvoid main(String args[]) throws SQLException { Connection connection=LinkDB.getMySqlConnection(); CallableStatement callableStatement=null; String procStr="{call inOneParamAndOutOneParam(?,?)}"; callableStatement=connection.prepareCall(procStr); String fruitName = "莲雾"; callableStatement.setString(1,fruitName); callableStatement.registerOutParameter(2,Types.DECIMAL); callableStatement.execute(); double fruitPrice=callableStatement.getDouble(2);//获取DECIMAL类型的属性要使用getDouble办法. System.out.println(fruitName+"的价格为:"+fruitPrice+"元"); LinkDB.close(connection,null); } }
5、输入参数即输出参数的存储过程 DELIMITER $$ CREATE PROCEDURE inOneParamISOutOneParam(INOUT fruitName VARCHAR(12)) BEGIN SELECT NAME INTO fruitName FROM fruit WHERE NAME LIKE CONCAT('%','%') LIMIT 0,1; END $$ DELIMITER ; 或 DELIMITER $$ CREATE PROCEDURE inOneParamISOutOneParam(INOUT fruitName VARCHAR(12)) BEGIN SELECT NAME FROM fruit WHERE NAME LIKE CONCAT('%',1 INTO fruitName; END $$ DELIMITER ; -- 注意上面查询语句不能这样写: -- SELECT NAME FROM fruit WHERE NAME LIKE CONCAT('%','%') INTO fruitName LIMIT 0,1; -- 注意:对比3、4和5Java文件内创建存储过程脚本中“INTO”关键字的位置你必定深有收获 /** * 输入参数即输出参数的存储过程 * * @author GaoHuanjie */ publicclass InOneParamISOutOneParam { publicstaticvoid main(String args[]) throws SQLException { Connection con = LinkDB.getMySqlConnection(); CallableStatement callableStatement = null; String procStr = "{call inOneParamISOutOneParam(?)}"; callableStatement = con.prepareCall(procStr); callableStatement.setString(1,"莲"); callableStatement.registerOutParameter(1,Types.VARCHAR); callableStatement.execute(); String fruitName = callableStatement.getString(1); System.out.println("表中水果名称含有‘莲’字的一中水果的名称是:" + fruitName); LinkDB.close(con,null); } }
以上代码展示了mysql存储过程以及在jdbc中调用的过程. 如果必要在mysql中调用 /*定义delimiter为 // */ delimiter // CREATE procedure sp_add3(a int,b int,out c int) begin set c=a+ b; end// 在mysql中调用存储过程 /* 改回默认值 ; */ delimiter ; // call sp_add3(1,2,@c); select@c; 附录: MySql中 delimiter 详解
其实就是告诉MySQL解释器,该段命令是否已经结束了,mysql是否可以执行了.默认情况下,delimiter是分号;.在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令. 如输入下面的语句 mysql> select * from test_table; 然后回车,那么MySQL将立即执行该语句. 但有时候,不希望MySQL这么做.在为可能输入较多的语句,且语句中包括有分号. 如试图在命令行客户端中输入如下语句 mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255),N INT) mysql> RETURNS varchar(255) mysql> BEGIN mysql> IF ISNULL(S) THEN mysql> RETURN ''; mysql> ELSEIF N<15 THEN mysql> RETURN LEFT(S,N); mysql> ELSE mysql> IF CHAR_LENGTH(S) <=N THEN mysql> RETURN S; mysql> ELSE mysql> RETURN CONCAT(LEFT(S,N-10),'...',RIGHT(S,5)); mysql> END IF; mysql> END IF; mysql> END; 默认情况下,不可能比及用户把这些语句全部输入完之后,再执行整段语句. 因为mysql一遇到分号,它就要自动执行. 即,在语句RETURN '';时,mysql解释器就要执行了. 这种情况下,就必要事先把delimiter换成其它符号,如//或$$. 《mysql JDBC 调用存储过程》是否对您有启发,欢迎查看更多与《mysql JDBC 调用存储过程》相关教程,学精学透。编程之家PHP学院为您提供精彩教程。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|