在具体的应用中,一个完整的操作会包含多条SQL语句。为了解决该问题,MySql提供了数据库对象存储过程。简单理解存储过程就是一条或者多条的SQL语句的集合。
存储过程的语法
CREATE PROCEDURE procedure_name([procedure_parameter[,...]])
[characteristic...] routine_body
上述语句中,procedure_name
表示所要创建的存储过程名字,procedure_parameter
参数表示存储过程的参数,characteristic
参数表示存储过程的特性,routine_body
参数表示存储过程的SQL语句代码,可以使用BEGIN…END来标志SQL语句的开始和结束
procedure_parameter的语法形式
[IN][OUT][INOUT] parameter_name type
上述三个参数分别表示输入/输出类型、参数名、参数类型。其中输入/输出类型分为3种,输入、输出、输入输出类型。
characteristic
LANGUAGE SQL
|[NOT] DETERMINISTIC
|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY {DEFINER|INVOKER}
|COMMENT 'string'
LANGUAGE SQL
,表示存储过程routine_body
部分是由SQL语言的语句组成,为MySQL软件所有默认的语句。[NOT] DETERMINISTIC
,表示存储过程的执行结果是否确定,如果值为DETERMINISTIC
表示执行结果是确定的,如果值是NOT DETERMINISTIC
,表示执行结果不确定,即相同的输入可能得到不同的输出,默认DETERMINISTIC
。{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
,表示使用SQL语句的限制。如果值为CONTAINS SQL
表示可以包含SQL语句,但不包含读或写数据的语句;如果值为NO SQL
表示不包含SQL语句;如果值为READS SQL DATA
表示包含读数据的语句,不包含写数据语句;如果值为MODIFIES SQL DATA
表示包含写数据的语句。默认为CONTAINS SQL
。SQL SECURITY {DEFINER|INVOKER}
,设置谁有权限来执行。如果值为DEFINER
,表示只有定义者自己才能够执行,如果INVOKER
表示调用者可以执行。默认值为DEFINER
。COMMENT 'string'
,表示注释语句。
查看存储过程的定义信息
SHOW CREATE PROCEDURE proce_name
proce_name
表示查询存储过程的名称。
修改存储过程
ALTER PROCEDURE procedure_name [characteristic...]
characteristic
与定义相比,取值只能如下(不能修改SQL语句代码,如果修改请删除重写):
|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY {DEFINER|INVOKER}
|COMMENT 'string'
删除存储过程
DROP PROCEDURE proce_name
存储过程实例使用
CREATE PROCEDURE getAmount(in userid INTEGER,out amount DOUBLE)
COMMENT '查询某学生总分'
BEGIN
select (englishgrade+chinesegrade+mathgrade) as amount
from user_info where id=userid;
END;
sql调用
call findAmount(1,@amount)
JDBC调用
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import cpm.plf.util.JdbcUtils;
public class UseProcedure {
public static double findAmount(int userid){
Connection conn = null;
CallableStatement cs =null;
try {
conn = JdbcUtils.getConnection();
cs = conn.prepareCall("{call findAmount(?,?)}");
cs.registerOutParameter(2, Types.DOUBLE);
cs.setInt(1, userid);
ResultSet result=cs.executeQuery();
double amount=0;
while(result.next()){
amount = result.getDouble("amount");
}
return amount;
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(cs!=null){
cs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
JdbcUtils.free(null, null, conn);
}
return 0;
}
public static int getNum(){
Connection conn = null;
CallableStatement cs =null;
try {
conn = JdbcUtils.getConnection();
cs = conn.prepareCall("{call getNum(?)}");
cs.registerOutParameter(1, Types.INTEGER);
ResultSet result=cs.executeQuery();
int num = 0;
if(result.next()){
num = result.getInt(1);//result.getInt("num")
}
return num;
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(cs!=null){
cs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
JdbcUtils.free(null, null, conn);
}
return 0;
}
}