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 \\将终止符定义为\\
mysql自定义存储过程_MySQL自定义函数、触发器、存储过程相关推荐
- MySQL学习记录 (五) ----- 存储函数、存储过程和触发器
相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...
- 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器
超详细图解![MySQL进阶篇]存储过程,视图,索引,函数,触发器 1.1 下载Linux 安装包 1.2 安装MySQL 1.3 启动 MySQL 服务 1.4 登录MySQL 2\. 索引 2.1 ...
- MySQL5_存储过程-sql编程-函数-触发器-用户管理
文章目录 MySQL_存储过程-sql编程-函数-触发器-用户管理 建立表 1.存储过程(procedure) (1)创建存储过程 (2)参数的类别 (3)删除存储过程 (4)查看存储过程的信息 (5 ...
- mysql函数使用场景_mysql的函数和存储过程的比较,以及在实际场景中的使用案例...
一.存储过程和函数的区别 函数调用有返回值 存储过程调用用call语句,函数调用直接饮用函数名+参数 IN,OUT,INOUT 只适用于存储过程,对函数而言所有参数默认都是输入参数 IN用于把数值传入 ...
- mysql批量插入数据的函数和存储过程
-- 创建函数前,设置 set global log_bin_trust_function_creators=TRUE; -- 新建函数-产生随机的字符串 drop function if exist ...
- mysql 昨天日期_MySQL 日期函数 今天明天昨天......
MySQL 获得当前日期时间 函数 获得当前日期+时间(date + time)函数:now() mysql> select now(); +---------------------+ | n ...
- split mysql的用法_mysql split函数用法实例
首先,大家要知道的是,在mysql中并没有split函数,需要自己写. 比如下面几个mysql split函数的例子. 例1,获得按指定字符分割的字符串的个数: 复制代码 代码示例: DELIMITE ...
- mysql 1418 存储过程_MySQL自定义函数 1418报错
现象 使用mysql创建.调用存储过程,函数以及触发器的时候会有错误符号为1418错误. [Err]1418 - This function has none of DETERMINISTIC, NO ...
- mysql 自定义过程_MySQL自定义函数
查询所有树状数据的后代节点 代码中a.centerid 为本身的唯一标示,a.parentcentid为父id标示 比如传入1 ,查出2,3,4,5,6 1 2 3 4 5 ...
最新文章
- 批处理之 for/f 详解
- [云炬创业基础笔记]第五章创业机会评估测试10
- ImportError: No module named setuptools
- 《关于我的那些面经》——百度后端(附答案)
- C#获取当前堆栈的各调用方法列表
- “iQOO”怎么读?vivo官宣“发音”视频
- 《TensorFlow 2.0深度学习算法实战教材》学习笔记(九、卷积神经网络)
- php 找到行mysql_php – Mysql – gt;使用order by时获取行位置
- pytorch之学习率变化策略之LambdaLR
- 定义域可以写成不等式吗_高一数学第一次月考考点之抽象函数定义域详解
- 解决windows下使用pycharm的anaconda安装numpy或tensorflow不成功的问题
- TreeView 动态绑定数据及在当前节点操作
- 西门子1200 PLC程序 通讯对象:PLC、CNC、机械手、RFID标签读写器、打标机、分布式远程IO模块、MES中控系统、AGV光通讯
- js对象的三种继承方式
- C语言三个点“...“符号含义之数组批量赋相同值
- “你公众号被封了!”
- 常用的第三方模块-Pillow
- Spark源码之coalesce算子
- UIPATH 数据提取
- 无需编程经验,这份Python自动聊天机器人代码帮你玩转对话交流!
热门文章
- Linux 输入子系统原理理解(原创)
- [dp] LeetCode 91. Decode Ways
- [Leetcode][第75题][JAVA][颜色分类][双(三)指针][计数排序]
- 同名字的数值求和插入行_EXCEL条件求和的6种技术,你会的超过3种吗?
- python如何处理数据_python数据处理之如何选取csv文件中某几行的数据
- 1195C. Basketball Exercise
- mysql事务总结_MySQL数据库和相关事务总结
- 将java项目做成app_将鸿蒙做成和EMUI一致,又兼容安卓APP,华为已立于不败之地...
- tidb vs mysql_一个长耗时SQL在TiDB和Mysql上的耗时测试
- X210烧写linux系统