mysql 存储过程调用原理

合集下载

在MySQL中使用存储过程实现数据迁移与同步

在MySQL中使用存储过程实现数据迁移与同步

在MySQL中使用存储过程实现数据迁移与同步引言:数据迁移和同步是在不同数据库之间传输和更新数据的常见需求。

MySQL提供了一种强大的工具,即存储过程,可以帮助我们实现这些任务。

本文将介绍如何在MySQL中使用存储过程来实现数据迁移和同步。

第一部分:理解存储过程的基本概念和原理存储过程是一组预定义的SQL语句集合,它们按照一定的顺序执行。

存储过程可以被调用执行,也可以在数据库中定时触发执行。

存储过程可以实现复杂的业务逻辑,将常用的操作和一系列SQL语句封装起来,提高了代码的重用性和可维护性。

第二部分:利用存储过程进行数据迁移数据迁移是将数据从一个数据库迁移到另一个数据库的过程。

在MySQL中,我们可以使用存储过程来实现数据迁移。

首先,我们需要创建一个存储过程,在其中编写对应的SQL语句,将数据从源数据库读取并插入到目标数据库中。

通过调用这个存储过程,我们可以一次性完成数据迁移的任务。

同时,我们还可以使用事务来确保数据的完整性和一致性。

第三部分:通过存储过程实现数据同步数据同步是在不同数据库之间保持数据一致性的过程。

利用存储过程,我们可以实现数据的周期性同步。

首先,我们需要创建两个存储过程,一个用来从源数据库读取更新的数据,另一个用来将这些数据插入到目标数据库中。

然后,我们可以使用MySQL的事件调度器来定期调用这两个存储过程,从而实现数据库之间的数据同步。

通过这种方式,我们可以减少手动操作的工作量,并确保数据库的数据一致性。

第四部分:存储过程的优势和注意事项存储过程具有以下几个优势:首先,它可以提高数据库的性能,减少网络开销。

因为存储过程在数据库服务器上运行,可以减少与客户端之间的数据传输。

其次,存储过程可以简化应用逻辑,提高代码的重用性和可维护性。

最后,存储过程可以提供更高的安全性,因为可以限制对数据库的直接访问。

然而,在使用存储过程时也需要注意以下几点:首先,存储过程应该被仔细设计和测试,以确保其正确性和性能。

mysql存储过程

mysql存储过程

mysql存储过程MySQL存储过程1. 存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

一个存储过程是一个可编程的函数,它在数据库中创建并保存。

它可以有SQL 语句和一些特殊的控制结构组成。

当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。

数据库中的存储过程可以看做是对编程中面向对象方法的模拟。

它允许控制数据的访问方式。

存储过程通常有以下优点:(1).存储过程增强了SQL语言的功能和灵活性。

存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

(2).存储过程允许标准组件是编程。

存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。

而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

(3).存储过程能实现较快的执行速度。

如果某一操作包含大量的Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。

因为存储过程是预编译的。

在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。

而批处理的Transaction-SQL 语句在每次运行时都要进行编译和优化,速度相对要慢一些。

(4).存储过程能过减少网络流量。

针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

(5).存储过程可被作为一种安全机制来充分利用。

系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

mysql存储过程之WHILE循环,LOOP循环以及REPEAT循环

mysql存储过程之WHILE循环,LOOP循环以及REPEAT循环

mysql存储过程之WHILE循环,LOOP循环以及REPEAT循环在MySQL存储过程的语句中有三个标准的循环⽅式:WHILE循环,LOOP循环以及REPEAT循环。

还有⼀种⾮标准的循环⽅式:GOTO,不过这种循环⽅式最好别⽤,很容易引起程序的混乱,在这⾥就不错具体介绍了。

这⼏个循环语句的格式如下:WHILE……DO……END WHILEREPEAT……UNTIL END REPEATLOOP……END LOOPGOTO下⾯⾸先使⽤第⼀种循环编写⼀个例⼦。

mysql> create procedure pro10()-> begin-> declare i int;-> set i=0;-> while i<5 do-> insert into t1(filed) values(i);-> set i=i+1;-> end while;-> end;//Query OK, 0 rows affected (0.00 sec)在这个例⼦中,INSERT和SET语句在WHILE和END WHILE之间,当变量i⼤于等于5的时候就退出循环。

使⽤set i=0;语句是为了防⽌⼀个常见的错误,如果没有初始化,i默认变量值为NULL,⽽NULL和任何值操作的结果都是NULL。

执⾏⼀下这个存储过程并产看⼀下执⾏结果:mysql> delete from t1//Query OK, 0 rows affected (0.00 sec)mysql> call pro10()//Query OK, 1 row affected (0.00 sec)mysql> select * from t1//+——-+| filed |+——-+| 0 || 1 || 2 || 3 || 4 |+——-+5 rows in set (0.00 sec)以上就是执⾏结果,有5⾏数据插⼊到数据库中,证明存储过程编写正确⽆误^_^。

mysql5.7存储过程写法总结

mysql5.7存储过程写法总结

MySQL 5.7 存储过程是一种在数据库中执行的预编译代码块,用于执行一系列操作。

以下是MySQL 5.7 存储过程的一些常见写法和总结:创建存储过程:sqlCREATE PROCEDURE procedure_name ([parameters])BEGIN-- 存储过程的逻辑代码END;参数定义:IN 参数:用于向存储过程传递值。

OUT 参数:用于从存储过程返回值。

INOUT 参数:既可以向存储过程传递值,也可以从存储过程返回值。

示例:sqlCREATE PROCEDURE example_procedure(IN param1 INT, OUT param2 VARCHAR(255)) BEGIN-- 存储过程的逻辑代码END;变量声明和使用:在存储过程中,可以使用 DECLARE 语句声明变量,并使用 SET 或 SELECT 语句为变量赋值。

示例:sqlDECLARE variable_name datatype;SET variable_name = value;-- 或者SELECT column_name INTO variable_name FROM table_name WHERE condition;控制流语句:MySQL 5.7 存储过程支持各种控制流语句,如 IF、CASE、LOOP、WHILE 等。

示例:sqlIF condition THEN-- 执行逻辑代码ELSEIF another_condition THEN-- 执行其他逻辑代码ELSE-- 执行默认逻辑代码END IF;错误处理:可以使用 DECLARE 语句声明错误处理程序,并在存储过程中使用 SIGNAL 或 RESIGNAL 语句引发或重新引发错误。

示例:sqlDECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGIN-- 错误处理逻辑代码END;游标:游标用于在存储过程中遍历查询结果集。

第11章 MySQL存储过程与函数 第1节存储过程与函数简介 (1)

第11章 MySQL存储过程与函数 第1节存储过程与函数简介 (1)

(2)创建函数
创建存储函数语法格式: create function sp_name ([func_parameter[,..]]) returns type [characteristic ..] routine_body
说明:在MySQL中,存储函数的使用方法与MySQL内部函数的 使用方法是一样的。换言之,用户自己定义的存储函数与MySQL 内部函数condition then statement_list [elseif search_condition then statement_list] … [else search_condition then statement_list] end if
数据库原理及MySQL应用 ——第十一章(第1节)
存储过程与函数简介
1.概念 2.存储过程和函数区别
1. 概念
一个存储过程是可编程的,它在数据库中创建并保存。它可以有SQL语句 和一些特殊的控制结构组成。
存储过程的优点: 存储过程增强了SQL语言的功能和灵活性; 存储过程允许标准组件是编程。 存储过程能实现较快的执行速度。 存储过程能过减少网络流量。 存储过程可被作为一种安全机制来充分利用。
【例19】删除存储过程studentcount
系统函数
1. 数学函数 2. 字符串函数 3. 日期和时间函数 4. 系统信息函数 5. 加密函数
具体使用 请参考教
材讲义
(6)repeat语句
repate语句是有条件控制的循环语句。 语法形式: [begin_label:] repeat statement_list until search_confition end repeat [end_label]
(7)while语句也是有条件控制的循环语句。

mysql内存分配机制

mysql内存分配机制

mysql内存分配机制主题:MySQL内存分配机制MySQL内存分配机制是指MySQL数据库在运行过程中对内存资源的分配和管理方式。

MySQL数据库是一种开源的关系型数据库管理系统,高效的内存分配是其优化性能的重要组成部分。

本文将从原理、过程和策略三个方面,逐步介绍MySQL的内存分配机制。

一、原理MySQL数据库通过自有的内存分配机制进行数据的读取、写入和查询等操作。

为了提高数据库的性能,MySQL会按照一定的规则将内存划分为不同的区域,例如InnoDB数据缓冲区、查询缓存区等,用于存储不同类型的数据或执行不同的任务。

二、过程MySQL内存分配机制的过程如下:1. 内存初始化:MySQL在启动时会分配一块内存区域作为内存池,用于存储各种缓冲区和其他内存结构。

2. 默认分配:MySQL通过参数配置文件中的默认值为每个缓冲区分配一定的内存空间。

例如,InnoDB存储引擎会根据参数配置文件的设定,为各个数据缓冲池分配内存。

3. 动态分配:MySQL根据实际运行情况动态分配内存。

例如,在查询执行过程中,MySQL会根据需要动态分配内存用于排序、连接操作等。

4. 内存回收:MySQL会定期或根据需要释放不再使用的内存,以便其他请求可以使用。

三、策略MySQL的内存分配机制通过一系列策略来优化内存的使用效率,包括:1. 数据结构优化:MySQL使用各种数据结构来存储内存中的数据,例如哈希表、树等。

合理选择数据结构可以提高查询和存储的效率。

2. 分配算法:MySQL通过各种算法来进行内存分配,例如最早可用算法、最佳适应算法等。

这些算法考虑了内存的利用率和性能需求,以尽量减少内存碎片和提高内存的使用效率。

3. 缓存管理:MySQL根据缓存管理策略,决定哪些数据需要被缓存以提高查询的响应速度。

例如,使用查询缓存可以将查询结果缓存起来,以便下次查询时直接返回结果,而不需要重复执行查询操作。

4. 内存调优:MySQL提供了一些参数和工具,可以对内存进行调优。

MySQL数据库应用实战教程 第5章 MySQL函数和存储过程

MySQL数据库应用实战教程 第5章 MySQL函数和存储过程

5.2.3 日期和时间函数
通过日期和时间函数可以获取当前日期、当前时间、年份、月份、 天、小时等关于日期的函数。日期和时间函数如表5.3所示。
表5.3 日期和时间函数
续表
常用的日期和时间函数如下。 (1)NOW():当前日期和时间,如2017-11-29 23:21:19。 (2)CURDATE():当前日期,如2017-11-29。 (3)CURTIME():当前时间,如23:22:49。 (4)YEAR(d):提取日期中的年份,如YEAR('2017-11-30')。 (5)MONTH(d):提取日期中的月份,如MONTH('20170819')。 (6)DAYOFYEAR(d):提取日期里一年中的第几天,如DAYOFYEAR ('2017-11-30')。
(11)DATE_ADD() :向后推时间。DATE_ADD(NOW(),INTERVAL 3 YEAR)表示当前时间往后推3年;DATE_ADD(NOW(),INTERVAL 3 MONTH)表示当前时间往后推3个月;DATE_ADD(NOW(),INTERVAL 3 DAY)表示当前时间往后推3天。
表5.1 数学函数
续表
常用的数学函数如下。 (1)CEILING(x):返回大于x的最小整数值,它是向上取整。 (2)FLOOR(x):返回小于x的最大整数值,它是向下取整。 (3)ROUND(x,y):返回参数x的四舍五入的有y位小数的值,进行 四舍五入,保留y位小数。 (4)TRUNCATE(x,y):返回数字x截短为y位小数的结果,不进行 四舍五入,直接保留y位小数。 (5)MOD(x,y):返回x/y的模,也是取余数,和x%y是等价的。
3.调用自定义函数

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

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连接。

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

mysql 存储过程调用原理
介绍
MySQL是一种常用的关系型数据库管理系统,它支持存储过程。

存储过程是一组预
编译的SQL语句,以及一些逻辑控制语句,它们被组合在一起形成一个可被重复调用的编程实体。

本文将探讨MySQL存储过程的调用原理。

存储过程的定义
存储过程是在数据库中预先定义的一组SQL语句集合,它们按照一定的顺序执行。

存储过程可以接受参数,并且可以返回结果。

它可以被视为一种封装了的数据库操作,可以在应用程序中通过调用存储过程来执行复杂的数据库操作。

存储过程的优势
使用存储过程有以下几个优势: - 减少网络传输:存储过程在数据库服务器上执行,减少了与数据库服务器之间的网络传输量。

- 提高性能:存储过程可以在数
据库服务器上进行预编译和优化,执行速度更快。

- 简化应用程序:存储过程将
复杂的业务逻辑封装在数据库中,应用程序只需要调用存储过程即可完成相应的操作。

存储过程的调用方式
存储过程可以通过以下几种方式进行调用: 1. 直接调用:使用CALL语句直接调
用存储过程,例如:CALL procedure_name(); 2. 函数调用:将存储过程作为函数
调用,例如:SELECT function_name(); 3. 触发器调用:在触发器中调用存储过程,例如:CALL procedure_name();
存储过程的执行过程
存储过程的执行过程主要包括以下几个步骤: 1. 解析:数据库服务器解析存储过程的语法,检查语法的正确性。

2. 编译:将存储过程的语句编译成可执行的机器码或字节码。

3. 优化:数据库服务器对存储过程进行优化,包括查询优化、执行计划优化等。

4. 执行:按照存储过程的定义,执行其中的SQL语句和逻辑控制语句。

5. 返回结果:如果存储过程定义了返回结果,将结果返回给调用者。

存储过程的参数传递
存储过程可以接受参数,并且可以有输入参数、输出参数和输入输出参数。

参数可以是任意的数据类型,包括基本数据类型和复合数据类型。

存储过程的参数传递有以下几种方式: 1. 位置参数:按照参数在参数列表中的位置进行传递,例如:CALL procedure_name(arg1, arg2, arg3); 2. 关键字参数:按照参数的名称进行传递,例如:CALL procedure_name(arg1 := value1, arg2 := value2, arg3 := value3);
存储过程的事务处理
存储过程可以嵌套事务,可以使用事务控制语句来控制事务的提交和回滚。

事务是一组SQL语句的执行序列,它们要么全部执行成功,要么全部执行失败。

存储过程的事务处理有以下几个关键点: 1. 开启事务:使用START TRANSACTION 语句开启一个事务。

2. 提交事务:使用COMMIT语句提交一个事务,将事务中的操作永久保存到数据库中。

3. 回滚事务:使用ROLLBACK语句回滚一个事务,将事务中的操作撤销。

存储过程的错误处理
存储过程可以使用异常处理语句来处理错误,例如使用DECLARE语句声明一个异常变量,使用SIGNAL语句抛出异常。

存储过程的错误处理一般包括以下几个步骤: 1. 声明异常变量:使用DECLARE语句声明一个异常变量,例如:DECLARE exception_name CONDITION FOR SQLSTATE value; 2. 抛出异常:使用SIGNAL语句抛出异常,例如:SIGNAL SQLSTATE value SET MESSAGE_TEXT = 'error message'; 3. 捕获异常:使用DECLARE ... HANDLER语句捕获异常,并在异常发生时执行相应的处理逻辑。

存储过程的调试
存储过程的调试可以使用以下几种方法: 1. 打印调试信息:使用SELECT语句打印调试信息,例如:SELECT 'debug message'; 2. 使用临时变量:在存储过程中使用临时变量保存中间结果,方便调试。

3. 使用调试工具:使用MySQL提供的调试工具,例如MySQL Workbench,可以设置断点、单步执行等。

存储过程的权限管理
存储过程的执行需要相应的权限,可以使用GRANT语句授予用户执行存储过程的权限。

权限管理是数据库安全的重要组成部分,可以限制用户对数据库的操作。

存储过程的权限管理包括以下几个方面: 1. 授权:使用GRANT语句授予用户执行存储过程的权限。

2. 撤销权限:使用REVOKE语句撤销用户对存储过程的权限。

3. 角色管理:使用角色来管理存储过程的权限,可以将一组权限授予角色,然后将角色授予用户。

总结
本文探讨了MySQL存储过程的调用原理,包括存储过程的定义、调用方式、执行过程、参数传递、事务处理、错误处理、调试和权限管理等方面。

存储过程是一种强大的数据库编程工具,可以提高应用程序的性能和简化开发过程。

熟练掌握存储过程的调用原理,对于开发高效的数据库应用程序非常重要。

相关文档
最新文档