存储过程

概念

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

在存储过程中可以使用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自定义存储过程_MySQL自定义函数、触发器、存储过程相关推荐

  1. MySQL学习记录 (五) ----- 存储函数、存储过程和触发器

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  2. 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器

    超详细图解![MySQL进阶篇]存储过程,视图,索引,函数,触发器 1.1 下载Linux 安装包 1.2 安装MySQL 1.3 启动 MySQL 服务 1.4 登录MySQL 2\. 索引 2.1 ...

  3. MySQL5_存储过程-sql编程-函数-触发器-用户管理

    文章目录 MySQL_存储过程-sql编程-函数-触发器-用户管理 建立表 1.存储过程(procedure) (1)创建存储过程 (2)参数的类别 (3)删除存储过程 (4)查看存储过程的信息 (5 ...

  4. mysql函数使用场景_mysql的函数和存储过程的比较,以及在实际场景中的使用案例...

    一.存储过程和函数的区别 函数调用有返回值 存储过程调用用call语句,函数调用直接饮用函数名+参数 IN,OUT,INOUT 只适用于存储过程,对函数而言所有参数默认都是输入参数 IN用于把数值传入 ...

  5. mysql批量插入数据的函数和存储过程

    -- 创建函数前,设置 set global log_bin_trust_function_creators=TRUE; -- 新建函数-产生随机的字符串 drop function if exist ...

  6. mysql 昨天日期_MySQL 日期函数 今天明天昨天......

    MySQL 获得当前日期时间 函数 获得当前日期+时间(date + time)函数:now() mysql> select now(); +---------------------+ | n ...

  7. split mysql的用法_mysql split函数用法实例

    首先,大家要知道的是,在mysql中并没有split函数,需要自己写. 比如下面几个mysql split函数的例子. 例1,获得按指定字符分割的字符串的个数: 复制代码 代码示例: DELIMITE ...

  8. mysql 1418 存储过程_MySQL自定义函数 1418报错

    现象 使用mysql创建.调用存储过程,函数以及触发器的时候会有错误符号为1418错误. [Err]1418 - This function has none of DETERMINISTIC, NO ...

  9. mysql 自定义过程_MySQL自定义函数

    查询所有树状数据的后代节点 代码中a.centerid 为本身的唯一标示,a.parentcentid为父id标示 比如传入1 ,查出2,3,4,5,6 1 2     3 4     5      ...

最新文章

  1. 批处理之 for/f 详解
  2. [云炬创业基础笔记]第五章创业机会评估测试10
  3. ImportError: No module named setuptools
  4. 《关于我的那些面经》——百度后端(附答案)
  5. C#获取当前堆栈的各调用方法列表
  6. “iQOO”怎么读?vivo官宣“发音”视频
  7. 《TensorFlow 2.0深度学习算法实战教材》学习笔记(九、卷积神经网络)
  8. php 找到行mysql_php – Mysql – gt;使用order by时获取行位置
  9. pytorch之学习率变化策略之LambdaLR
  10. 定义域可以写成不等式吗_高一数学第一次月考考点之抽象函数定义域详解
  11. 解决windows下使用pycharm的anaconda安装numpy或tensorflow不成功的问题
  12. TreeView 动态绑定数据及在当前节点操作
  13. 西门子1200 PLC程序 通讯对象:PLC、CNC、机械手、RFID标签读写器、打标机、分布式远程IO模块、MES中控系统、AGV光通讯
  14. js对象的三种继承方式
  15. C语言三个点“...“符号含义之数组批量赋相同值
  16. “你公众号被封了!”
  17. 常用的第三方模块-Pillow
  18. Spark源码之coalesce算子
  19. UIPATH 数据提取
  20. 无需编程经验,这份Python自动聊天机器人代码帮你玩转对话交流!

热门文章

  1. Linux 输入子系统原理理解(原创)
  2. [dp] LeetCode 91. Decode Ways
  3. [Leetcode][第75题][JAVA][颜色分类][双(三)指针][计数排序]
  4. 同名字的数值求和插入行_EXCEL条件求和的6种技术,你会的超过3种吗?
  5. python如何处理数据_python数据处理之如何选取csv文件中某几行的数据
  6. 1195C. Basketball Exercise
  7. mysql事务总结_MySQL数据库和相关事务总结
  8. 将java项目做成app_将鸿蒙做成和EMUI一致,又兼容安卓APP,华为已立于不败之地...
  9. tidb vs mysql_一个长耗时SQL在TiDB和Mysql上的耗时测试
  10. X210烧写linux系统