mysql自定义存储过程_MySQL自定义函数、触发器、存储过程

存储过程

概念

存储过程,是一个数据库对象,类似一个函数。

在存储过程中可以使用SQL中的绝大部分内容,并且可以加入编程语言的特性(循环判断分支)。

编写好存储过程之后,可以在客户端调用存储过程,存储过程会自动的执行里面的一系列代码

在存储过程中使用DDL/DML/TCL 和普通SQL一样,DQL和普通SQL略有区别。

创建存储过程

创建存储过程的语法

create PROCEDURE 过程名称([参数列表])

BEGIN

SQL语句

END;

--参数列表的声明规范:参数的输入、输出类型 参数名称 参数的类型;过个参数之间用逗号分隔

--参数的输入/输出类型

1. In类型 外界数据传递给存储过程

2. Out类型 可以把存储过程中的数据返回给外界调用者

3. INOUT类型 既可以传入 又可以传出

创建存储过程

-- 创建一个存储过程,查询EMP表中的数据总数并返回结果

-- 注意:声明过程中需指明参数类型,但是没有参数长度的指定

create PROCEDURE FUNC1(OUT Total INT)

BEGIN

-- 把查询结果赋值给OUT类型的参数 select .. into .. from ..

-- 通过OUT类型参数将结果返回给调用者

select count(1) into Total from emp;

END;

查看创建的存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `FUNC1`(OUT Total INT)

BEGIN

-- 把查询结果赋值给OUT类型的参数

-- 通过OUT类型参数将结果返回给调用者

select count(1) into Total from emp;

END;

调用存储过程

-- 调用义好的存储过程,就像调用函数一样

call FUNC1(@Total); -- 调用存储过程,通过@Total给存储过程传递一个OUT类型参数

select @Total; -- 存储过程通过OUT类型参数返回结果,查询OUT类型参数获取存储过程的执行结果

删除存储过程

drop procedure FUNC1;

练习

-- 创建存储过程 返回两个数相加的结果

-- 如果没有指明参数的输入输出类型,默认为IN类型

create procedure func2(num1 INT,num2 int,OUT res int)

begin

-- 把num1+num2的结果赋值给res

set res = num1+num2;

end;

-- 调用存储过程,查询结果,参数名字并不一定与定义的参数名一样

call func2(10,20,@re);

select @re; --30

存储过程缺点

不能移植 无法移植 在不同数据库中,存储过程语法不同

不能移植 一旦使用存储过程 将无法移植

不能移植 除非不考虑移植 才使用存储过程

面试问到就说没用过,因为项目考虑数据移植性

自定义函数

-- 定义一个函数

create function f007(arg1 int, arg2 int)

returns int

Begin

declare result int default 0;

set result = arg1 + arg2;

return(result);

end ;

-------------------------------调用函数--------------

select f007(1,5);

函数与存储过程的区别

函数必须有返回值

函数中不能使用SQL

触发器

当对某张表做DML操作时,可以使用触发器自定义关联行为。

触发器用于在数据库的DML操作之前/之后执行某些操作

触发器trigger的定义语法

-- 在tab1表中创建一个触发器trig1 在每一行数据插入之前/之后 do something

create TRIGGER trig1 before/after insert on tab1 for each row

begin

--do something

end;

NEW关键字 代表新数据 NEW.name获取新数据的name值

OLD关键字 代表老数据

-- 在emp_bak中创建触发器t1,每次往emp_bak插入数据之前

create trigger t1 before insert on emp_bak for each row

begin

-- 执行往emp_bak1表插入相同的数据 NEW代表新数据

insert into emp_bak1(empno,ename)values(NEW.empno,NEW.ename);

end;

-- 测试

insert into emp_bak(empno,ename)values(2234,"张三");

-- 在emp_bak中创建触发器t2,每次update emp_bak数据之后

create trigger t2 after update on emp_bak for each row

begin

-- 在emp_bak1表中执行相同的操作 OLD代表老数据

update emp_bak1 set ename = NEW.ename where ename=OLD.name;

end;

-- 测试

update emp_bak set ename="张三丰" where ename="张三";

不推荐使用视图和触发器

视图 在开发环境怎么折腾都没问题 但是用于生产环境时视图想变动就难了

delimiter

终止符定义,默认是;

delimiter \\将终止符定义为\\

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

36中介者模式(Mediator Pattern)

依赖关系的转化: 动机(Motivate): 在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。 在这种情况…

相似理论与模型试验_正交实验下的固液耦合相似材料研究

原标题:基于正交试验的固液耦合相似材料研究摘 要:为了研究矿井突水演化规律,通过正交试验研制出一种能同时满足固体力学与水理性的固液 耦合相似材料,该相似材料以河沙为骨料、水泥和大白粉为胶结剂、液体石蜡和淀粉为调节剂。采用 极差分析…

35解释器模式(Interpreter Pattern)

动机(Motivate): 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。 在这种情况下,将特定领域的问题表达为某种文法规则下的句子,…

37职责链模式(Chain of Responsibility Pattern)

动机(Motivate): 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受…

python3中format函数列表_Python3之字符串格式化format函数详解(上)

173.jpg概述在Python3中,字符串格式化操作通过format()方法或者fstring实现。而相比于老版的字符串格式化方式,format()方法拥有更多的功能,操作起来更加方便,可读性也更强。该函数将字符串当成一个模板,通过传入的参数…

38备忘录模式(Memento Pattern)

对象状态的回溯: 对象状态的变化无端,如何回溯/恢复对象在某个点的状态? 动机: 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够…

python剪切文件如何恢复_用python实现的可以拷贝或剪切一个文件列表中的所有文件...

# coding:utf-8import osimport sysdef cut_and_paste_file(source, destination):source: file path 中文destination: directory pathdef format_path(path):if not os.path.isabs(path):path os.path.join(os.getcwd(), path)return pathdef mk_dir(path):if not os.path.e…

39策略模式(Strategy Pattern)

算法与对象的耦合: 对象可能经常需要使用多种不同的算法,但是如果变化频繁,会将类型变得脆弱... 动机: 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将…

python选择表单_如何使用Python在表单中选择选项?

下面是一些基本用法示例:>>> import mechanize>>> br mechanize.Browser()>>> br.open(http://www.w3schools.com/html/html_forms.asp)表单有一个name属性;但有时它是空的:>>> [f.name for f in br.fo…

40访问者模式(Visitor Pattern)

类层次结构的变化: 类层次结构中可能经常由于引入新的操作,从而将类型变得脆弱... 动机: 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接…

ssh中c3p0连接mysql_ssh 中使用c3p0 的连接池配置 | 学步园

applicationContext.xml 文件:xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:jee"http://www.springframework.org/schema/jee"xsi:schemaLocation"http://www.springframework.org/schema/beans http://www.springframewor…

41状态模式(State Pattern)

对象状态影响对象行为: 对象拥有不同的状态,往往会行使不同的行为... 动机: 在软件构建过程中,某些对象的状态如果改变以及其行为也会随之而发生变化,比如文档处于只读状态,其支…

python中空格属于字符吗_举例说明python中空格是属于字符

python中空格属于字符吗?答案是肯定的,空格在Python中也是属于字符的。案例:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。#!/usr/bin/python# -*- coding: UTF-8 -*-import strings raw_input(input a st…

python如何引发和处理异常_在python3.6中,如何捕捉异常并引发异常以便稍后处理?...

假设我有两个例外:class FooError (Exception):def __init__(self, *args, **kwargs):default_message A foo error has occurred!if not (args or kwargs): args (default_message,)super().__init__(*args, **kwargs)class BarError (Exception):def __init__(s…

2字节十六进制浮点数 qt_Qt之8个字节转化为double小数

首先要理解double的存储方式,具体可查找相关的博客本文实现的是将8个字节(存储为16进制的字符串)转化为对应的double类型double MainWindow::qByteArraytodouble(QString qstr){QByteArray byte;StringToHex(qstr,byte);double result;memcpy(&result, byte.dat…

【转】如何将域中的AD数据导入SharePoint

最近刚装好sharepoint2010,想要研究一下,第一件想做的事就是想把AD中的用户信息导入到SharePoint中。 那现在就来看看我是怎么操作的: 1.打开管理中心 sharepoint是通过“用户配置文件同步服务”来实现同步,所以第一步要开启这个…

Apsara Clouder专项技能认证:实现调用API接口

一.API 简介 1.API 的概念 API(Application Programming Interface应用程序编程接口)是一些预定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码或理解内部工作机制的细节 2.API 的特点 API 是一个明确定义的接口,可以为其…

druid加密mysql_Druid 数据库用户密码加密 代码实现

标签:druid-1.0.16.jar 阿里巴巴的开源数据连接池 jar包明文密码私钥(privateKey)加密加密密码加密密码公钥(publicKey)解密明文密码程序代码如下:package com.t1;import com.alibaba.druid.filter.config.ConfigTools;public class DruidTest {public s…

select switch语句总是搞混,总结如下

select switch语句总是搞混,总结如下 类C:c c c# java : 比较 switch(expression) { case constant-expression : statement(s); break; /* optional */ case constant-expression : statement(s); brea…

java路径怎么找_Java路径怎么找

有一种情况是装好java了,配置好java环境(在Linux里面比较复杂)了,但忘了路径了?!解决:先要申明一下which java是定位不到安装路径的。which java定位到的是java程序的执行路径。网上的资料都是人云亦云,完全…