mysql存储过程.详细说明,java代码调用过程
- 格式:doc
- 大小:41.00 KB
- 文档页数:6
存储过程调用java代码的方法存储过程是一组SQL语句的集合,可以被视为一种预编译的SQL 语句,可以通过存储过程调用来实现对数据库的操作。
在Java中,我们可以通过以下方法来调用存储过程:1. 使用JDBC调用存储过程使用JDBC调用存储过程需要以下步骤:1)获取数据库连接。
2)创建CallableStatement对象,使用存储过程名称作为参数创建对象。
3)设置输入参数和输出参数。
输入参数可以通过setXXX()方法设置,输出参数可以使用registerOutParameter()方法注册。
4)执行存储过程。
可以使用execute()或executeUpdate()方法执行。
5)获取输出参数。
以下是一个简单的示例:```try(Connection conn = DriverManager.getConnection(url, user, password)) {CallableStatement cs = conn.prepareCall('{call procedure_name(?, ?)}');cs.setInt(1, 1); // 设置输入参数cs.registerOutParameter(2, Types.VARCHAR); // 注册输出参数cs.execute(); // 执行存储过程String result = cs.getString(2); // 获取输出参数System.out.println(result);} catch (SQLException e) {e.printStackTrace();}```2. 使用ORM框架调用存储过程使用ORM框架调用存储过程需要根据不同的框架进行配置。
以下是使用MyBatis调用存储过程的示例:1)在Mapper XML文件中定义存储过程调用语句。
```<select id='callProcedure' statementType='CALLABLE'>{call procedure_name(#{param1, mode=IN,jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})}</select>```2)在Java代码中调用Mapper方法。
浅谈MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量。
简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量。
1、declare定义的变量类似java类中的局部变量,仅在类中⽣效。
即只在存储过程中的begin和end之间⽣效。
2、@set定义的变量,叫做会话变量,也叫⽤户定义变量,在整个会话中都起作⽤(⽐如某个应⽤的⼀个连接过程中),即这个变量可以在被调⽤的存储过程或者代码之间共享数据。
如何理解呢?可以看下⾯这个简单例⼦,很好理解。
(1)先执⾏下⾯脚本,创建⼀个存储过程,分别有declare形式的变量和@set形式的变量
DROP PROCEDURE IF EXISTS temp;
DELIMITER //
CREATE PROCEDURE temp()
BEGIN
DECLARE a INT DEFAULT 1;
SET a=a+1;
SET @b=@b+1;
SELECT a,@b;
END
//
DELIMITER ;
(2)接着为b变量初始化。
SET @b=1;
(3)然后重复调⽤这个存储过程。
CALL temp();
(4)会发现a的值不改变,⽽b的值会⼀直增加。
所以,总结起来就是开头那句话,declare定义的类似是局部变量,@set定义的类似全局变量。
以上这篇浅谈MySQL存储过程中declare和set定义变量的区别就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
mysql存储过程execute的用法在MySQL中,存储过程是一组为了完成特定功能的SQL 语句集。
你可以使用EXECUTE语句来执行存储过程。
以下是如何使用EXECUTE语句执行存储过程的简单示例:1. 创建存储过程首先,让我们创建一个简单的存储过程:sql复制代码:DELIMITER //CREATE PROCEDURE SimpleProcedure()BEGINSELECT 'Hello, World!';END //DELIMITER ;2. 执行存储过程要执行上面的存储过程,你可以使用以下EXECUTE语句:sql复制代码:CALL SimpleProcedure();或者,你也可以使用EXECUTE语句:sql复制代码:EXECUTE SimpleProcedure();3. 使用EXECUTE传递参数如果你想在存储过程中使用参数,你可以这样做:sql复制代码:DELIMITER //CREATE PROCEDURE ParameterizedProcedure(IN param1 INT)BEGINSELECT CONCAT('Parameter value: ', param1);END //DELIMITER ;然后,你可以这样调用它并传递一个参数:sql复制代码:CALL ParameterizedProcedure(123);或者,使用EXECUTE语句:sql复制代码:EXECUTE ParameterizedProcedure(123);4. 注意事项•在使用EXECUTE之前,确保你已经定义了存储过程。
否则,你会收到一个错误。
•如果你使用的是MySQL的某个版本,并且该版本不支持EXECUTE语句,那么你可能需要使用CALL语句来代替。
mysql存储过程、函数中in、out、inout参数使⽤实际案例之前在学习mysql时,通常把笔记记录到word⽂档,最近打算学习下springdatajpa调⽤存储过程。
(忘记在命令⾏⾏中怎么调⽤存储过程了),找了好久才找到之前的笔记,在此将之前内容拷贝到博客,顺便回顾下存储过程与函数。
存储过程的调⽤:1、参数为In类型:案例功能:求1-n的和-- 求1----n的和delimiter $$create procedure p1(in n int) begindeclare total int default0; declare num int default0; while num<n doset num:=num+1;set total:=total+num;end while ;select total ;end $$delimiter ;call p1(100);2、参数为out类型:这⾥还要注意⼀点的就是我们的输出参数⼀定要设置相应类型的初始,否则不管你怎么计算得出的结果都为NULL值案例功能:求1-n的和delimiter $$create procedure p2(in n int ,out total int)begindeclare num int default0;set total:=0;while num<n doset num=num+1;set total=total+num;end while;end $$delimiter ;-- 调⽤call p2(100,@res);select@res;注意:对于第⼀个输⼊参数我们可以理解,但是第⼆个输出参数我们到底应该怎么输?这⾥我们需要对第⼆个参数定义⼀个变量名(更形象点就是你输⼊⼀个输⼊类型的参数n,由输出参数total往外输出我们只需要定义⼀个变量名来接收这个输出值即可)call p2(100,@sum)$//这⾥的@sum就是我定义⽤来接收处处total的值select @sum;3.参数为INOUT类型案例功能:传⼀个年龄,⾃动让年龄增长10岁delimiter $$create procedure p4(inout age int)beginset age=age+10;end $$-- 调⽤过程set@age=8;call p4(@age);select@age;注意:调⽤的时候,我这⾥需要和⼤家声明⼀下,inout型的参数值既是输⼊类型⼜是输出类型,你给它⼀个值,值不是变量,不是变量那out的时候它怎么赋给这个值是不是?因此我们需要先设置⼀个变量并初始化这个值,调⽤的时候直接传这个变量即可。
使用MySQL的存储过程实现定时任务和计划引言在软件开发中,定时任务和计划是非常常见的需求。
通过定时任务和计划,我们可以定期执行一些重复性的操作,比如数据备份、数据清理等。
MySQL提供了存储过程来实现这些定时任务和计划,本文将介绍如何使用MySQL的存储过程来实现这些功能。
一、什么是存储过程存储过程是一组预编译的SQL语句的集合,可以作为一个单元整体被数据库管理系统调用和执行。
存储过程可以实现复杂的业务逻辑,并且可以被多个应用程序共享和调用。
二、创建存储过程使用MySQL创建存储过程非常简单,下面以创建一个定时任务为例进行介绍。
首先,我们需要在MySQL中创建一个存储过程,比如我们创建一个名为"task_schedule"的存储过程。
在创建存储过程之前,我们首先需要确保MySQL支持存储过程的功能,可以通过执行以下SQL语句进行检查:```SHOW VARIABLES LIKE 'have_procedure';```如果输出结果中的值是"YES",表示MySQL支持存储过程。
接下来,我们可以使用"CREATE PROCEDURE"语句来创建存储过程。
下面是创建一个名为"task_schedule"的存储过程的示例代码:DELIMITER $$CREATE PROCEDURE task_schedule()BEGIN-- 在此处编写任务执行的逻辑END$$DELIMITER ;```在这个示例代码中,我们使用"DELIMITER"语句来改变分隔符,将其设置为"$$",这是因为存储过程的定义中可能包含多个SQL语句,而分号(";")是SQL语句的默认分隔符,为了避免分号与存储过程代码中的其他分号冲突,我们需要将分隔符改为其他值。
然后,我们使用"CREATE PROCEDURE"语句来创建存储过程,并在BEGIN和END之间编写任务执行的逻辑。
MySQL中的存储过程与函数调试技巧在开发数据库应用程序时,我们经常会使用存储过程和函数来简化数据处理和业务逻辑。
MySQL作为一种流行的关系型数据库管理系统,提供了强大的存储过程和函数功能,但在开发过程中,我们有时会遇到一些问题,例如存储过程或函数无法正确运行、输出结果不符合预期等。
为了解决这些问题,本文将向您介绍一些MySQL中的存储过程与函数调试技巧。
1. 使用调试语句MySQL提供了一些用于调试存储过程和函数的语句,例如SELECT语句和PRINT语句。
您可以在存储过程或函数中插入这些语句,以输出中间结果或查看某些变量的值。
在运行存储过程或函数时,这些调试语句将输出到MySQL的客户端或日志文件中,从而帮助您分析和解决问题。
下面是一个示例,展示了如何在存储过程中使用PRINT语句输出变量的值:```mysqlCREATE PROCEDURE debug_demo()BEGINDECLARE my_var INT;SET my_var = 10;PRINT my_var;-- 其他代码...END;```在调试时,您可以运行这个存储过程,并观察MySQL客户端或日志文件中打印的变量值。
通过查看这些输出,您可以确定存储过程的执行过程是否符合预期,并找出问题所在。
2. 使用调试工具除了在存储过程或函数中插入调试语句外,您还可以使用一些MySQL调试工具来辅助调试。
以下是两个常用的工具:MySQL Workbench:这是官方推荐的MySQL调试工具,它提供了强大的图形化界面,可以方便地调试存储过程和函数。
您可以在Workbench中设置断点、查看变量值、单步执行等,以便更好地理解和跟踪代码的执行过程。
Navicat for MySQL:这是另一个常用的MySQL客户端工具,也提供了丰富的调试功能。
Navicat支持在存储过程和函数中设置断点、查看变量值、运行到下一个断点等操作,帮助您定位和修复问题。
mysql存储过程的返回语句MySQL存储过程是一种在MySQL数据库中定义的一组SQL语句集合,通过调用存储过程可以实现复杂的数据库操作。
存储过程可以返回结果集、返回单个值或者返回多个值。
下面列举了10个常见的MySQL存储过程的返回语句。
1. 返回结果集存储过程可以通过SELECT语句返回结果集。
例如,下面的存储过程返回了一个员工表中所有员工的姓名和工资:```CREATE PROCEDURE get_employees()BEGINSELECT name, salary FROM employees;END```2. 返回单个值存储过程可以通过SELECT INTO语句返回单个值。
例如,下面的存储过程返回了员工表中的最高工资:```CREATE PROCEDURE get_highest_salary()BEGINSELECT MAX(salary) INTO @max_salary FROM employees;SELECT @max_salary;END```3. 返回多个值存储过程可以通过OUT参数返回多个值。
例如,下面的存储过程返回了员工表中的最低工资和最高工资:```CREATE PROCEDURE get_salary_range(OUT min_salary DECIMAL(10, 2), OUT max_salary DECIMAL(10, 2))BEGINSELECT MIN(salary) INTO min_salary FROM employees;SELECT MAX(salary) INTO max_salary FROM employees;END```4. 返回游标存储过程可以通过DECLARE CURSOR语句返回一个游标,用于遍历结果集。
例如,下面的存储过程返回了一个包含员工表中所有员工的游标:```CREATE PROCEDURE get_employees_cursor()BEGINDECLARE cur CURSOR FOR SELECT * FROM employees;OPEN cur;-- 遍历游标并处理结果集CLOSE cur;END```5. 返回错误信息存储过程可以通过SIGNAL语句返回自定义的错误信息。
JAV A通过MyBatis调用MySql存储过程和函数1.引言无论是采用SPRING MVC框架开发WEB画面,还是开发需按一定时间间隔执行的批处理,都可能要调用数据库的存储过程或函数。
其间调用参数设置不正会浪费大量调试时间初学者甚至放弃使用存储过程。
本文记录了通过MyBatis调用MySql存储过程和函数的具体参数设置内容,供参考。
2.MySql存储过程例/*全公司员工下一年度带薪休假一发赋予处理*/CREATE DEFINER=`DBuser`@`%` PROCEDURE `paid_vacation_compute `( OUT p_返回值 INT(11) ,INOUT p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))PROC_START:BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENSET p_返回值 = 9;LEAVE PROC_START;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENSET p_返回值 = 6;LEAVE PROC_START;END IF;END LOOP;COMMIT;END3.MySql函数例CREATE DEFINER=`DBuser`@`%` FUNCTION ` paid_vacation_compute `( p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))) RETURNS int(11)BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENRETURN 9;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENRETURN 6;END IF;END LOOP;COMMIT;END4.MySql存储过程调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { call paid_vacation_compute (#{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT},#{StaffNumber,javaType=String, jdbcType=CHAR, mode=INOUT},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN})}</select></mapper>5.MySql函数调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { #{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT} =call paid_vacation_compute (#{StaffNumber,javaType=String, jdbcType=CHAR, mode=IN},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN} )} </select></mapper>6.JAVA调用例1(MySql存储过程和函数相同)package com.XXX.impl;import java.util.ArrayList;import java.util.List;import com.XXX.web.bean.VacationCreateBean;import com.XXX.web.dao.BaseInfoEditDAO;import com.XXX.web.util.BasicSqlSupport;public class BaseInfoEditDAOImpl extends BasicSqlSupport implements BaseInfoEditDAO { public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception {boolean blnFlag=false;//成功FLAG;//全公司员工下一年度带薪休假一发赋予处理VacationCreateBean objVacationCreateBean = new VacationCreateBean();objVacationCreateBean.setStaffNumber(objUserInfo.getSTAFF_NUMBER());objVacationCreateBean.setHireDate(objUserInfo.getDATE_HIRE().toString());objVacationCreateBean.setOperateID(objUserInfo.getCREATE_USER_ID());objVacationCreateBean.setDhcWorkYearsShinKi(objUserInfo.getDHC_WORK_YEARS());String returnValue = (String)this.session.selectOne("com.XXX.web.mapper.base_info_edit.VacationProcedure", objVacationCreateBean);//System.out.println("staffNumber=" + objVacationCreateBean.getStaffNumber());//System.out.println("result=" + objVacationCreateBean.getReturnValue());//System.out.println("returnValue=" + returnValue);//追加結果の判断blnFlag=true;return blnFlag;}}7.処理DAO接口package com.XXX.web.dao;import java.util.List;import com.XXX.web.bean.BaseInfoEditBean;/*** 员工基本信息画面の処理DAO*/public interface BaseInfoEditDAO {public List<BaseInfoEditBean> selectAuthoriyList() throws Exception;public String selectStaffId() throws Exception;public int selectOpetateTimeNum(String strStaffNumber) throws Exception;public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public boolean updateBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public BaseInfoEditBean searchBaseInfo(String strStaffNumber) throws Exception; }8.共同処理package com.XXX.web.util;import org.apache.ibatis.session.SqlSession;public class BasicSqlSupport{protected SqlSession session;public SqlSession getSession() {return session;}public void setSession(SqlSession session) {this.session = session;} }9. DAO与MAP间的交互BEANpackage com.XXX.web.bean;import java.io.Serializable;public class VacationCreateBean implements Serializable{private int ReturnValue;private String StaffNumber;private String HireDate;private String OperateID;private int WorkYearsShinKi;public int getReturnValue() {return ReturnValue;}public void setReturnValue(int returnValue) {ReturnValue = returnValue;}public String getStaffNumber() {return StaffNumber;}public void setStaffNumber(String staffNumber) {StaffNumber = staffNumber;}public String getHireDate() {return HireDate;}public void setHireDate(String hireDate) {HireDate = hireDate;}public String getOperateID() {return OperateID;}public void setOperateID(String operateID) {OperateID = operateID;}public int getDhcWorkYearsShinKi() {return dhcWorkYearsShinKi;}public void setDhcWorkYearsShinKi(int dhcWorkYearsShinKi) {this.dhcWorkYearsShinKi = dhcWorkYearsShinKi;}}10.通过MAIN函数进行调用package com.ohc.pms.batch;import java.io.FileInputStream;import java.io.IOException;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Properties;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;public class VacationCreate {/**JDBC驱动名 */static String jdbcDriver = "com.mysql.jdbc.Driver";/**DB URL */static String dbURL = "jdbc:mysql://172.999.999.35:3306/empdb";/** DB用户名 */static String user = "empuser";/**DB密码 */static String pass = "empuser123";/**日志输出 */static protected Logger log = Logger.getLogger(VacationCreate.class );public static void main(String[] args) {Connection conn = null;CallableStatement stmt = null;try{PropertyConfigurator.configure(System.getProperty("user.dir") + "\\" + "log4j.properties");("実行路径:" + System.getProperty("user.dir"));String fileName = "jdbc.properties"; // 属性文件名Properties conf = new Properties();try {conf.load(new FileInputStream(System.getProperty("user.dir") + "\\" + "jdbc.properties"));} catch (IOException e) {System.err.println("Cannot open " + fileName + ".");e.printStackTrace();System.exit(-1); // 程序終了}// 读入jdbcDriver = conf.getProperty("driver");dbURL = conf.getProperty("url");user = conf.getProperty("user");pass = conf.getProperty("password");//JDBC driver登録Class.forName("com.mysql.jdbc.Driver");("DB连接。
MySQL中的存储过程调试技巧MySQL作为一个流行的关系型数据库管理系统,经常被用于开发和管理各种类型的应用程序。
在开发过程中,存储过程是一种常见的数据库对象,它可以存储一系列的SQL语句,并可以通过调用来执行这些语句。
然而,存储过程的调试对于开发人员来说可能是一项具有挑战性的任务。
在本文中,我们将探讨一些MySQL中的存储过程调试技巧,帮助开发人员更加高效地解决问题。
一、使用调试语句MySQL提供了一些内置的调试语句,可以用于在存储过程中输出变量值或执行过程中的信息。
其中,最常用的是`SELECT`语句和`PRINT`语句。
1. 使用`SELECT`语句在存储过程中使用`SELECT`语句,可以在执行过程中输出变量的值。
通过在关键位置插入`SELECT`语句,开发人员可以查看各个变量的值,并判断程序是否按预期进行。
例如,下面的代码段演示了如何使用`SELECT`语句输出变量的值:```sqlDECLARE @var INT;SET @var = 10;SELECT @var;```2. 使用`PRINT`语句与`SELECT`语句不同,`PRINT`语句在存储过程中不会产生结果集,而是直接将文本输出到客户端。
通过在关键位置插入`PRINT`语句,开发人员可以输出一些执行过程中的信息,以便调试。
例如,下面的代码段演示了如何使用`PRINT`语句输出信息:```sqlDECLARE @var INT;SET @var = 10;PRINT 'The value of @var is: ' + CAST(@var AS VARCHAR);```二、使用条件语句和循环除了使用调试语句,开发人员还可以使用条件语句和循环来控制程序的执行流程,以便在特定条件下进行调试。
以下是一些常用的条件语句和循环语句。
1. 使用`IF`语句`IF`语句是一种常见的条件语句,在存储过程中可以根据特定条件执行不同的操作。
mysql 存储过程写法MySQL 存储过程的写法如下:1. 创建存储过程```CREATE PROCEDURE procedure_name (in parameter_type parameter_name, out parameter_type parameter_name, inout parameter_type parameter_name)BEGIN-- 存储过程体END;```其中,`parameter_type` 表示参数类型,`parameter_name` 表示参数名称。
`in` 表示输入参数,`out` 表示输出参数,`inout` 表示传入传出参数。
2. 编写存储过程体存储过程体是存储过程的主体部分,通过 SQL 语句实现所需的功能。
```BEGIN-- 声明变量DECLARE variable_name variable_type;-- 赋值SET variable_name = value;-- 条件判断IF condition THEN-- SQL 语句ELSE-- SQL 语句END IF;-- 循环语句WHILE condition DO-- SQL 语句END WHILE;-- 返回结果SELECT column_name INTO variable_name FROM table_name WHERE condition;END;```3. 调用存储过程调用存储过程,使用 `CALL` 关键字和存储过程名称。
```CALL procedure_name(parameter);```其中,`parameter` 是存储过程的参数,可根据需要传入相应的值。
mysql存储函数递归调用-回复MySQL存储函数递归调用是指在MySQL数据库中,可以使用存储函数自身的特性,实现函数自我调用的功能。
这种技术在处理一些需要迭代计算的问题时非常有用,如树形结构的存储和操作,或者图形结构的存储和操作。
在本文中,我们将逐步介绍和解释MySQL存储函数递归调用的概念和用法。
第一步:了解存储函数和递归在开始讨论MySQL存储函数递归调用之前,我们首先要了解存储函数和递归的概念。
存储函数是一种在数据库中定义的函数,可以用于执行一系列的操作,并返回一个结果。
存储函数可以通过定义参数与返回值来实现各种不同的功能。
递归是指在一个函数内部调用自身的过程。
在递归中,函数会重复执行相同的操作,并通过不断改变输入参数的值,最终达到停止递归的条件。
第二步:使用存储函数和循环实现伪递归在MySQL中,没有直接支持递归调用的语法。
不过,我们可以使用存储函数和循环来实现伪递归调用。
假设我们有一个表`Employee`,其中包含了员工的ID、姓名和直接上级的ID。
我们需要编写一个存储函数,根据员工的ID,找到他的所有上级,并返回一个逗号分隔的字符串。
首先,我们可以定义一个存储函数`getSupervisor`,它接受一个员工ID 作为输入参数,并返回一个字符串。
在函数内部,我们可以使用一个循环来实现查找上级的逻辑。
具体的实现步骤如下:1. 定义存储函数`getSupervisor`,并定义一个参数`empID`。
2. 声明一个变量`supervisorIDs`,用于保存上级ID的字符串。
3. 使用一个循环,在每次迭代中,查询出当前员工的上级ID,并将其拼接到`supervisorIDs` 中。
4. 将当前员工的ID更新为上级的ID,继续下一次迭代。
5. 当上级ID为NULL时,停止循环,并返回`supervisorIDs`。
通过上述步骤,我们就可以在存储函数中实现递归调用的效果。
第三步:使用表达式和递归调用实现真正的递归虽然使用存储函数和循环可以实现类似递归的效果,但这种方法在处理层级比较多的情况下,代码会变得非常复杂和冗余。
springmybatis3.2调⽤mysql存储过程返回多结果集(完整、亲测、可⽤)最近,有个开发提了个需求,希望中间件⽀持调⽤mysql存储过程时⽀持多结果集返回,因为某些原因我们使⽤了不少的存储过程,很多复杂的逻辑⽬前来看交互⾮常的多,所以从当前的现状来说,这个需求还是蛮合理的。
中午抽空特地搜了下,整合完整⽰例如下:1、创建测试存储过程delimiter $$CREATE PROCEDURE sp_multi_resultset(IN p_operator_company_no int,IN p_operator_no int,OUT p_error_code varchar(32),OUT p_error_info varchar(255))BEGINselect1as col1,2as col2;select11as col11,22as col21;end $$delimiter ;call sp_multi_resultset(1,1,@error_code,@error_info);2、mapper⽂件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="MultiResultset"><resultMap type="test.Test" id="test1"><result column="col1" property="col1" jdbcType="INTEGER" javaType="Integer"/><result column="col2" property="col2" jdbcType="INTEGER" javaType="Integer"/></resultMap><resultMap type="test.Test2" id="test2"><result column="col1" property="col1" jdbcType="INTEGER" javaType="Integer"/><result column="col3" property="col3" jdbcType="INTEGER" javaType="Integer"/></resultMap><select id="getTests" statementType="CALLABLE" parameterType="Map" resultMap="test1,test2">{call sp_multi_resultset(#{param1,mode=IN,jdbcType=INTEGER},#{param2,mode=IN,jdbcType=INTEGER},#{errorCode,mode=OUT,jdbcType=VARCHAR},#{errorInfo,mode=OUT,jdbcType=VARCHAR})}</select></mapper>3、java代码/****/package com.medsoft.top10.dao;import java.util.HashMap;import java.util.List;import java.util.Map;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.cyl.kernel.util.JsonUtils;/*** @author zhjh256@* {@link} /zhjh256*/@Servicepublic class TestMultiResultSet implements InitializingBean {@Autowiredprivate SqlSessionTemplate sqlSession;/* (non-Javadoc)* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()*/@Overridepublic void afterPropertiesSet() throws Exception {Map<String,String> map = new HashMap<String,String>();map.put("param1", "1");map.put("param2", "1");map.put("errorCode", "");map.put("errorInfo", "");List<List<?>> multiResult = sqlSession.selectList("MultiResultset.getTests",map);System.out.println(JsonUtils.toJson(multiResult.get(0)));System.out.println(JsonUtils.toJson(multiResult.get(1)));}}输出:[{"col1":1,"col2":2}][{"col1":1,"col3":2}]昨天测试的时候,漏掉了property="colX"导致返回的是[null],罪过啊。
DROP PROCEDURE IF EXISTS add_;DELIMITER //CREATE PROCEDURE add_(IN a INT,IN b INT,OUT c INT)BEGINSELECT a+b INTO c; END //package com.example.demo.dao;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Options;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.mapping.StatementType;import java.util.Map;@Mapperpublic interface CallMapper {/*** 注解形式调⽤存储过程 * @param map */@Select("call add_(#{map.a,mode=IN,jdbcType=INTEGER},#{map.b,mode=IN,jdbcType=INTEGER},#{map.d,mode=OUT,jdbcType=INTEGER})") @Options(statementType=StatementType.CALLABLE)void callProcedure(@Param("map")Map map); /*** 使⽤配置⽂件形式调⽤存储过程 * @param map */// void callProcedure2(Map map);}@RunWith(SpringRunner.class)@SpringBootTestpublic class CallMapperTest { @Resourceprivate CallMapper callMapper;@Testpublic void testProcedure(){ Map<String,Object> map = new HashMap<>(); map.put("a",2);map.put("b",3); map.put("d",-1);callMapper.callProcedure(map);System.out.println(map);}/*@Test public void testProcedure2(){Map<String,Object> map = new HashMap<>(); map.put("a",2); map.put("b",3); map.put("c",-1);callMapper.callProcedure2(map);System.out.println(map); }*/}使⽤mybatis 调⽤存储过程(注解形式和配置⽂件形式)最近在看资料中涉及到mybatis ,突然想到mysql 中的视图、存储过程、函数。
MySQL存储过程in、out和inout参数⽰例和总结存储过程1.创建存储过程并查看全局变量mysql> create database yy;Query OK, 1 row affected (0.00 sec)mysql> use yy;Database changedmysql> set @num1=10,@num2=20,@num3=30; //设置全局变量mysql> delimiter $$mysql> create procedure p(in num1 int,out num2 int,inout num3 int)-> begin-> select num1,num2,num3;-> set num1=100,num2=200,num3=300;-> select num1,num2,num3;-> end $$Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;mysql> call p(@num1,@num2,@num3);总结1:in 和 inout 参数会将全局变量的值传⼊存储过程中,⽽ out 参数不会将全局变量的值传⼊存储过程中。
在存储过程使⽤中,参数值 in、out、inout 都会发⽣改变。
2.调⽤存储过程时全局变量值的变化mysql> select @num1,@num2,@num3;总结2:当调⽤完存储过程后,发现 in 参数不会对全局变量的值引起变化,⽽ out 和 inout 参数调⽤完存储过程后,会对全局变量的值产⽣变化,会将存储过程引⽤后的值赋值给全局变量。
in参数赋值类型可以是变量还有定值,⽽out和inout参数赋值类型必须是变量。
到此这篇关于MySQL存储过程in、out和inout参数⽰例和总结的⽂章就介绍到这了,更多相关MySQL存储过程in、out和inout参数内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
mysql-connector-java-xxx-bin.jar包的使⽤Class.forName("com.mysql.jdbc.Driver")的作⽤第⼀步、将mysql连接包放在lib⽬录上,并右键Build Path——Add to Build Path,即可将其加载进eclipse中的引⽤包Reference Library下,作为提供ava中连接数据库的驱动。
第⼆步、编写代码,Student实体对象类、JDBC类以及测试类。
Student类:package com.xiaoxiao.jdbc;public class Student {public static int id;public static String name;public static int age;public Student(int id,String name,int age){this.id=id;=name;this.age=age;}public static int getId() {return id;}public static void setId(int id) {Student.id = id;}public static String getName() {return name;}public static void setName(String name) { = name;}public static int getAge() {return age;}public static void setAge(int age) {Student.age = age;}}JDBC类:package com.xiaoxiao.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.xiaoxiao.forExemple.Person;public class JDBC {Connection connection; //连接数据库的连接对象PreparedStatement preparedStatement; //预编译语句ResultSet resultSet; //获得的结果集//编辑数据库连接池:mysql数据库连接驱动(com.mysql.jdbc.Driver)、JDBC url地址、登录名和密码public Connection getConnection(){String url="jdbc:mysql://localhost:3306/family";String userName="root";String password="1234";try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {System.out.println("找不到驱动");e.printStackTrace();}try {connection=DriverManager.getConnection(url,userName,password);if (connection!=null) {System.err.println("数据库连接成功");}} catch (SQLException e) {System.out.println("数据库连接失败");e.printStackTrace();}return connection;}/** 1、执⾏静态SQL语句。
往MySQL中存储图⽚的⽅法1 介绍在设计到数据库的开发中,难免要将图⽚或⾳频⽂件插⼊到数据库中的情况。
⼀般来说,我们可以同过插⼊图⽚⽂件相应的存储位置,⽽不是⽂件本⾝,来避免直接向数据库⾥插⼊的⿇烦。
但有些时候,向MySQL中插⼊图⽚更加容易管理。
那么在MySQL中该怎么存储呢?参考资料[1]中有个相当清晰的例⼦,不过是基于MySQL图形界⾯的查询⼯具Query Brower的,你的机⼦上没有安装的话,可能得不到很好的理解。
我在这⾥不在赘述,更详细的资料请看给出的链接吧。
还有,[1]中的例⼦其实只是向我们说明了Query Brower的易⽤和强⼤,对我们在开发中实际应⽤不是很⼤。
所以下⾯就让我们⽤JAVA写⼀个向MySQL中存储的简单实例。
2 建表⾸先,先要在数据库中建表。
我在名为test的数据库下建⽴了⼀个叫pic的表。
该表包括3列,idpic, caption和img。
其中idpic 是主键,caption是对图⽚的表述,img是图像⽂件本⾝。
建表的SQL语句如下:DROP TABLE IF EXISTS `test`.`pic`;CREATE TABLE `test`.`pic` (`idpic` int(11) NOT NULL auto_increment,`caption` varchar(45) NOT NULL default '',`img` longblob NOT NULL,PRIMARY KEY (`idpic`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;将上⾯的语句输⼊到命令⾏中(如果安装了Query Brower,你可以按照参考[1]中的指⽰来建表,那样会更加⽅便。
),执⾏,表建⽴成功。
3 实现图像存储类表完成后,我们就开始写个Java类,来完成向数据库中插⼊图⽚的操作。
我们知道,Java与数据库连接是通过JDBC driver来实现的。
sybase数据库存储过程调用外部JAVA2010-01 老鸟现在基本上所有的数据库都支持存储过程嵌入JAVA程序,以便实现在没有系统服务器的情况定时调度任务。
对于不同的数据库,存储过程和调用方法都不相同。
下面主要以Sybase 举例。
对于这部分,教程上的说的及其含糊以及混乱。
我用的版本是12.7.它内置的JDK版本是1.3.所以我们需要的工具是JDK1.3和eclipse2.1版本。
用eclipse的目的不是为了编译,而是测试我们写的JAVA类是否能够正常执行。
因为在数据库环境下,对JAVA的错误没有任何提示,通常的提示是找不到自定义的类。
首先编写一个正常的JAVA类import java.io.File;import java.io.IOException;public class Invoice {public static String lineItem1Description;public static double lineItem1Cost;public static String lineItem2Description;public static double lineItem2Cost;public static double totalSum(){double runningsum;double taxfactor=1+Invoice.rateOfTaxation();runningsum=lineItem1Cost+lineItem2Cost;runningsum=runningsum*taxfactor;return runningsum;}public static double rateOfTaxation(){double rate;rate=.15;return rate;}public static void init(String item1desc,double item1cost,String item2desc,double item2cost){lineItem1Description=item1desc;lineItem1Cost=item1cost;lineItem2Description=item2desc;lineItem2Cost=item2cost;}public static String getLineItem1Description(){return"你好";}public static double getLineItem1Cost(){return lineItem1Cost;}public static String getLineItem2Description(){return"他好";}public static double getLineItem2Cost(){return lineItem2Cost;}}如果需要另外的JAR,必须在Sybase central java editon里把JAR导入。
MySQL存储过程循环MySQL 存储过程循环MySQL循环语句(包括WHILE,REPEAT和LOOP)来根据条件反复运⾏代码块。
MySQL提供循环语句,允许您根据条件重复执⾏⼀个SQL代码块。
MySQL中有三个循环语句:WHILE,REPEAT和LOOP。
我们将在以下部分中更详细地检查每个循环语句。
WHILE循环WHILE语句的语法如下:WHILE expression DOstatementsEND WHILEWHILE循环在每次迭代开始时检查表达式。
如果expression为TRUE,MySQL将执⾏WHILE和END WHILE之间的语句,直到expression为FALSE。
WHILE循环称为预先测试条件循环,因为它总是在执⾏前检查语句的表达式。
下⾯的流程图说明了WHILE循环语句:以下是在存储过程中使⽤WHILE循环语句的⽰例:DELIMITER $$DROP PROCEDURE IF EXISTS test_mysql_while_loop$$CREATE PROCEDURE test_mysql_while_loop()BEGINDECLARE x INT;DECLARE str VARCHAR(255);SET x =1;SET str='';WHILE x <=5 DOSET str= CONCAT(str,x,',');SET x = x +1;END WHILE;SELECT str;END$$DELIMITER ;在上⾯的test_mysql_while_loop存储过程中:⾸先,重复构建str字符串,直到x变量的值⼤于5。
然后,使⽤SELECT语句显⽰最终的字符串。
要注意,如果不初始化x变量的值,那么它默认值为NULL。
因此,WHILE循环语句中的条件始终为TRUE,并且您将有⼀个不确定的循环,这是不可预料的。
下⾯来测试test_mysql_while_loopstored调⽤存储过程:CALL test_mysql_while_loop();执⾏上⾯查询语句,得到以下结果mysql> CALL test_mysql_while_loop();+------------+|str|+------------+|1,2,3,4,5, |+------------+1 row in setQuery OK, 0 rows affectedREPEAT循环REPEAT循环语句的语法如下:REPEATstatements;UNTIL expressionEND REPEAT⾸先,MySQL执⾏语句,然后评估求值表达式(expression)。
MySQL存储过程中的3种循环在MySQL存储过程的语句中有三个标准的循环⽅式:WHILE循环,LOOP循环以及REPEAT循环。
还有⼀种⾮标准的循环⽅式:GOTO,不过这种循环⽅式最好别⽤,很容易引起程序的混乱,在这⾥就不错具体介绍了。
这⼏个循环语句的格式如下:WHILE……DO……END WHILEREPEAT……UNTIL END REPEATLOOP……END LOOPGOTO。
下⾯⾸先使⽤第⼀种循环编写⼀个例⼦。
DROP PROCEDURE IF EXISTS `pro10`;DELIMITER $$CREATE PROCEDURE `pro10`()BEGIN-- 定义变量DECLARE v_i int unsigned DEFAULT0;WHILE v_i <5 DOSELECT v_i;SET v_i = v_i+1;END WHILE;END $$DELIMITER ;CALL pro10();再来看⼀下第⼆个循环控制指令 REPEAT……END REPEAT。
使⽤REPEAT循环控制语句编写下⾯这个存储过程:DROP PROCEDURE IF EXISTS `pro11`;DELIMITER $$CREATE PROCEDURE `pro11`()BEGIN-- 定义变量DECLARE v_i int unsigned DEFAULT0;REPEATSELECT v_i;SET v_i = v_i+1;UNTIL v_i >=5END REPEAT;END $$DELIMITER ;CALL pro11();再来看⼀下第三个循环控制语句LOOP……END LOOP。
编写⼀个存储过程程序如下:DROP PROCEDURE IF EXISTS `pro12`;DELIMITER $$CREATE PROCEDURE `pro12`()BEGIN-- 定义变量DECLARE v_i int unsigned DEFAULT0;LOOP_LABEL:LOOPSELECT v_i;SET v_i = v_i+1;IF v_i >=5THENLEAVE LOOP_LABEL;END IF;END LOOP;END $$DELIMITER ;CALL pro12();DROP PROCEDURE IF EXISTS `pro13`;DELIMITER $$CREATE PROCEDURE `pro13`()BEGIN-- 定义变量DECLARE v_i int unsigned DEFAULT0;LOOP_LABEL:LOOPIF v_i =3THENSET v_i = v_i+1;ITERATE LOOP_LABEL; # =>continueEND IF;SELECT v_i;SET v_i = v_i+1;IF v_i >=5THENLEAVE LOOP_LABEL; # =>break;END IF;END LOOP;END $$DELIMITER ;CALL pro13();Labels 标号和 END Labels 结束标号在使⽤loop的时候,使⽤到的labels标号,对于labels可以⽤到while,loop,rrepeat等循环控制语句中。
MYSQL存储过程专题-注释详解原⽂链接,本⽂增加了注释、补充了部分运⾏错误、使⽤了不同MYSQL版本MySQL存储过程0.环境说明:软件版本mysql8.0navicat1.使⽤说明存储过程时数据库的⼀个重要的对象,可以封装SQL语句集,可以⽤来完成⼀些较复杂的业务逻辑,并且可以⼊参出参(类似于java中的⽅法的书写)。
创建时会预先编译后保存,⽤户后续的调⽤都不需要再次编译。
// 把editUser类⽐成⼀个存储过程public void editUser(User user,String username){String a = "nihao";user.setUsername(username);}main(){User user = new User();editUser(user,"张三");user.getUseranme(); //java基础还记得不}⼤家可能会思考,⽤sql处理业务逻辑还要重新学,我⽤java来处理逻辑(⽐如循环判断、循环查询等)不⾏吗?那么,为什么还要⽤存储过程处理业务逻辑呢?优点:在⽣产环境下,可以通过直接修改存储过程的⽅式修改业务逻辑(或bug),⽽不⽤重启服务器。
执⾏速度快,存储过程经过编译之后会⽐单独⼀条⼀条执⾏要快。
减少⽹络传输流量。
⽅便优化。
缺点:过程化编程,复杂业务处理的维护成本⾼。
调试不便不同数据库之间可移植性差。
-- 不同数据库语法不⼀致!2.准备:数据库参阅资料中的sql脚本;delimiter $$ --声明结束符3.语法#### 3.0 语法结构```sql-- 存储过程结构CREATE[DEFINER = user]PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_body-- 1. proc_parameter参数部分,可以如下书写:[ IN | OUT | INOUT ] param_name type-- type类型可以是MySQL⽀持的所有类型-- 2. routine_body(程序体)部分,可以书写合法的SQL语句 BEGIN ... END简单演⽰:-- 声明结束符。
Mysql存储过程调用
说明:
由括号包围的参数列必须总是存在。
如果没有参数,也该使用一个空参数列()。
每个参数默认都是一个IN参数。
要指定为其它参数,可在参数名之前使用关键词OUT或INOUT
在mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。
当使用delimiter命令时,你应该避免使用反斜杠(‘"’)字符,因为那是MySQL的转义字符。
1、创建过程格式:
Mysql> drop procedure if exists user_findById;
Mysql> delimiter //
Create procedure user_findById(in n int)
Begin
Select * from user where id= n;
End
//
调用过程:
Mysql> set @n=1; --定义变量
Call user_findById(@n);--调用过程
// --显示结果
======================================================
例2:
Mysql> drop procedure if exists user_count;
Mysql> delimiter //
Create procedure user_count(out count int)
Begin
Select count(*) into count from user;
End
// --结束
注意:
MySQL存储过程
“in”参数:
跟 C语言的函数参数的值传递类似, MySQL存储过程内部可能会修改此,参数,但对 in类型参数的修改,对调用者(caller)来说是不可见的(not visible)。
“out”参数:
从存储过程内部传值给调用者。
在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值inout参数跟 out类似,都可以从存储过程内部传值给调用者。
不同的是:调用者还可以通过 inout参数传递值给存储过程。
总结:如果仅仅想把数据传给MySQL存储过程,那就使用“in”类型
参数;如果仅仅从MySQL存储过程返回值,那就使用“out”类型参数;如果需要把数据传给MySQL存储过程,还要经过一些计算后再传回给我们,
此时,要使用“inout”类型参数。
JAVA中调用过程:
/**
* 调用过程cal_ning,计算class_id班的最高成绩和名字 * @param class_id 班号
*/
public static void callProc(int class_id){
String sql = "{call cal_ning(?,?,?)}";
//获得连接
Connection conn = null;
CallableStatement stmt = null;
//构造语句对象,传递过程及参数,返回结果
try{
conn = ConnectionUtils.getConnection();// 工具类获得连接
stmt = conn.prepareCall(sql);
//输入参数,
stmt.setInt(1, class_id);
//注册输出参数的位置和类型
stmt.registerOutParameter(2, Types.CHAR);
stmt.registerOutParameter(3, Types.INTEGER);
//执行
stmt.execute();
//取出过程运行的结果,指定输出参数的位置
String name = stmt.getString(2);
int score = stmt.getInt(3);
System.out.println(name.trim() + " : " + score); }catch(Exception e){
e.printStackTrace();
}finally{
//关闭资源
ConnectionUtils.close(stmt);
ConnectionUtils.close(conn);
}
例2:
/**
* 调用过程ProcLogin_ning,输入两个参数,返回结果
* @param id 考生id
* @param pwd 考生密码
* @return 成功:1; id正确,pwd错:0; 没有id: -1
*/
public static int login(int id, String pwd){ int flag = -1;
String sql = "{call proclogin_ning(?,?,?) }";
Connection conn = null;
CallableStatement stmt = null;
try{
conn = ConnectionUtils.getConnection();
stmt = conn.prepareCall(sql);
stmt.setInt(1, id);
stmt.setString(2, pwd);
stmt.registerOutParameter(3, Types.INTEGER);
stmt.execute();
flag = stmt.getInt(3);
}catch(Exception e){
e.printStackTrace();
}finally{
ConnectionUtils.close(stmt);
ConnectionUtils.close(conn);
}
return flag;
}。