MySQL存储过程之java调用 (带有输入和输出参数的java调用)
(2012-12-12 13:44:41)
MySQL5存储过程,用得人好像不多。按照数据库设计原理来讲,存储过程是在db
server上预编译的,所以查询速度会比较起纯SQL语句快很多。可能是现在流行OO,导至存储过程使用的余地大打折扣。但如果从效果上来讲,用存储过程来实现业务规则所带得DB
SERVER压力,比用JAVA类实现业务规则所带来的WEB
SERVER压力要小。当然存储过程也不应滥用,象普通的insert、update之类的语句就不需要使用存储过程了。
好了,言归正传。MySQL创建procudure的语法与sql
server/Oracle差别较大。
例1:传入参数的procedure
create procedure usp_test(param varchar(20)
select * from talbeName
where column=param |
例2:更新表的procedure
create procedure usp_test2 (t varchar(20))
begin
set
xname = 'test';
update
table set column = xname where column1=t;
end
|
MySQL创建存储过程时不带as,而且()不能省略,即便是没有传入参数。这一点象sql
server或是oracle那样直观,而且声明变量时直接用declare,不用加的@或@@(in
out变量除外)。还有一点是很怪的语法,如果是以“select”为开头的存储过程,是不能加"begin end"的。"begin
end"表示多条SQL语句的复合体。
当然,事实上几乎没有哪款数据库是完全符合SQL3标准的,多少都含有自己的一些成份里面,这也造成使用存储过程会使程序的可移性降低。
调用procedure
MySQL使用call关键字。例:call
usp_test('test');而不是execute,同样()是不能省略的。
创建完procedure后,再看看java是如何调用procedure的。
Connection
conn = null;
CallableStatement
cstmt = null;
ResultSet
rs = null;
try{
conn
= DbConn.getDbConn();//get pool conn
CallableStatement
cstmt = conn.prepareCall("{call usp_test(?)}");
call.setString(1,
"test");
rs
= call.executeQuery();
while(rs.next()){
String
te = rs.getString(1);
System.out.println("te:"+te);
}
}catch(Exception
e){
System.out.println("e:
"+e);
}finally{
try{
rs.close();
cstmt.close();
conn.close();
}catch(Exception
ex){
System.out.println("ex:"+ex);
}
|