存储过程

概念

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

在存储过程中可以使用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 \\将终止符定义为\\

MySQL自定义函数、触发器、存储过程的更多相关文章

  1. MySQL自定义函数与存储过程

    1.前置条件 MySQL数据库中存在表user_info,其结构和数据如下: mysql> desc user_info; +-----------+----------+------+---- ...

  2. MySQL自定义函数与存储过程的创建、使用、删除

    前言 日常开发中,可能会用到数据库的自定义函数/存储过程,本文记录MySQL对自定义函数与存储过程的创建.使用.删除的使用 通用语法 事实上,可以认为存储过程就是没有返回值的函数,创建/使用/删除都非 ...

  3. MySQL自定义函数和存储过程的区别:

    自定义函数和存储过程的区别: 1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强.存储过程,功能强大,可以执行包括修改表等一系列数据库操作:用户定义函数不能用于执行一组修改全局 ...

  4. MYSQL数据库重点:自定义函数、存储过程、触发器、事件、视图

    一.自定义函数 mysql自定义函数就是实现程序员需要sql逻辑处理,参数是IN参数,含有RETURNS字句用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句. 语法: 创建: ...

  5. mysql创建自定义函数与存储过程

    mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql ...

  6. mysql自定义函数并在存储过程中调用,生成一千万条数据

    mysql 自定义函数,生成 n 个字符长度的随机字符串 -- sql function delimiter $$ create function rand_str(n int) returns VA ...

  7. mysql 自定义函数

    原文:http://www.cnblogs.com/zhangminghui/p/4113160.html 引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利 ...

  8. sqlserver自定义函数与存储过程的区别 实例详解

    分享下sql server自定义函数与存储过程的区别,一起来学习下. 一.自定义函数: 1. 可以返回表变量 2. 限制颇多,包括 不能使用output参数: 不能用临时表: 函数内部的操作不能影响到 ...

  9. MySQL 自定义函数CREATE FUNCTION实例

    分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (i ...

  10. Mysql中函数和存储过程的区别

    Mysql中函数和存储过程的区别 存储过程: 1.       可以写sql语句 2.       inout,out构造返回值 3.       调用:call:存储过程名称 4.       可以 ...

随机推荐

  1. Java学习计划

    Java学习计划&书单--2018.10.13 W3C Struts教程 W3C Spring教程 W3C Hibernate教程 <深入JavaWeb技术内幕> Java Web ...

  2. 第1章 Python基础

    一.安装Python windows: 1.下载安装包     https://www.python.org/downloads/ 2.安装     默认安装路径:C:\python27 3.配置环境 ...

  3. c# 捕获一般获取不到的异常

    1.主函数入口加异常事件,代码例如: /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void M ...

  4. 阿帕奇web服务器下载部署安装运行

    链接: https://jingyan.baidu.com/album/d8072ac47baf0eec95cefdca.html?picindex=4 1.apache服务安装成功可是启动失败“wi ...

  5. 【每日scrum】NO.9

    (1)这是我们冲刺的最后一天,晚上我们的团队进行了收尾工作:第一阶段的任务基本完成,软件主要实现了校园景点照片以及对应的介绍,查询最短路径,查询涉及相关景点的查询,查询全部路径,基本界面的设计,导航功 ...

  6. 用vs调试项目的时候报HTTP 错误 403.14 - Forbidden

    曾经遇到过这种诡异的问题,你一定想不到,这个可能是因为你用svn合并的时候,导致了你的dll文件出了问题. 竟然可以用主干的dll替换的方式,解决掉这个问题.

  7. Spring源码解析 – AnnotationConfigApplicationContext容器创建过程

    Spring在BeanFactory基础上提供了一些列具体容器的实现,其中AnnotationConfigApplicationContext是一个用来管理注解bean的容器,从AnnotationC ...

  8. 判断字符串中是否存在的几种方案:string.indexof、string.contains、list.contains、list.any几种方式效率对比

    我们在做项目时,可能会遇到这样的需求,比如判断,1,2,3,33,22,123, 中是否存在,3,. var str=",1,2,3,33,22,123,"; 一般有几种方式: 1 ...

  9. div跟随鼠标移动

    1.目标是实现div跟随鼠标而移动,分三种情况进行实现 a)首先获取div,进行绑定鼠标移动事件,给div开启定位功能 第一种实现方式,假如body的大小跟页面大小一样,则可以用这个方法. 1)获取鼠 ...

  10. C++11 锁 lock

    转自:https://www.cnblogs.com/diegodu/p/7099300.html 互斥(Mutex: Mutual Exclusion) 下面的代码中两个线程连续的往int_set中 ...