欢迎进入linux社区论坛,与200万技术人员互动交流 >>进入
简单使用mysql的存储过程
mysql5.0版本引进了存储过程的概念。存储过程可以提高执行效率,更容易维护。
在没有存储过程(procedure)概念之前,通常的业务逻辑sql代码有时很长,它们一般被嵌入在宿主语言(比如java)中,非常不便于维护,而有了存储过程,它们被定义在数据库端,并且进行了预编译。而且业务逻辑sql代码无需在网络中传输,减轻了网络负担。可以说存储过程的优点大于它的缺点。
下面实现一个简单的加法存储过程。
[sql]
mysql> delimiter $
mysql> create procedure pr_add (a int , b int)
-> begin
-> declare c int;
-> if a is null then
-> set a = 0;
-> end if;
-> if b is null then
-> set b = 0;
-> end if;
-> set c = a + b;
-> select c as sum;
-> end;
-> $
在命令行模式中运行存储过程:
[sql]
mysql> delimiter ;
mysql> set @a = 10;
query ok, 0 rows affected (0.00 sec)
mysql> set @b = 20;
query ok, 0 rows affected (0.00 sec)
mysql> call pr_add(@a,@b);
+------+
| sum |
+------+
| 30 |
+------+
1 row in set (0.00 sec)
query ok, 0 rows affected (0.00 sec)
在客户端执行存储过程:
[java]
public class proceduretest {
private static final string db_url = jdbc:mysql://localhost:3306/zjut;
private static final string driver = com.mysql.jdbc.driver;
private static final string user = root;
private static final string password = xxxxx;
private static string sql = call pr_add(?,?);
public static void main(string[] args) {
try {
class.forname(driver);
connection conn = drivermanager.getconnection(db_url,user,password);
callablestatement cstmt = conn.preparecall(sql);
cstmt.setint(1,10);
cstmt.setint(2, 20);
resultset rs = cstmt.executequery();
while(rs.next()) {
system.out.println(rs.getint(sum));
}
} catch (classnotfoundexception e) {
e.printstacktrace();
} catch (sqlexception e) {
e.printstacktrace();
}
}
}
关键代码是:
[java]
callablestatement cstmt = conn.preparecall(call pr_add(?,?));
cstmt.setint(1,10);
cstmt.setint(2, 20);
resultset rs = cstmt.executequery();
输出:
30
原理:首先创建sql字符串,即 call pr_add(?,?) ,调用存储过程用call命令,call命令后跟存储过程名字,两个问号是占位符。
使用connection对象创建callablestatement对象,即 conn.preparecall(sql); 该方法接受一个字符串,代表一个sql语句。
再用callablestatement对象的executequery()执行sql语句,返回一个resultset对象。
利用resultset对象遍历得到的数据。
