浅析MySQL数据库的存储过程

在具体的应用中,一个完整的操作会包含多条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;
	}
}

你可能感兴趣的:(数据库,mysql)