mysql存储过程.详细说明,java代码调用过程

合集下载

存储过程调用java代码的方法

存储过程调用java代码的方法

存储过程调用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定义变量的区别

浅谈MySQL存储过程中declare和set定义变量的区别

浅谈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存储过程 execute的用法

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存储过程、函数中in、out、inout参数使用实际案例

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的存储过程实现定时任务和计划引言在软件开发中,定时任务和计划是非常常见的需求。

通过定时任务和计划,我们可以定期执行一些重复性的操作,比如数据备份、数据清理等。

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中的存储过程与函数调试技巧在开发数据库应用程序时,我们经常会使用存储过程和函数来简化数据处理和业务逻辑。

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存储过程是一种在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语句返回自定义的错误信息。

JAVA通过MyBatis调用MySql存储过程和函数

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中的存储过程调试技巧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 存储过程写法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` 是存储过程的参数,可根据需要传入相应的值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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;
}。

相关文档
最新文档