浅析MySQL数据库的存储过程

本文详细介绍了MySQL中的存储过程,包括其定义、语法、特性以及如何通过JDBC进行调用。涵盖了创建、修改存储过程的命令和示例,以及使用CallableStatement进行参数传递和结果获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值