mysql存储过程触发器_MySQL存储过程及触发器

一、存储过程

存储过程的基本格式如下:

-- 声明结束符

-- 创建存储过程

DELIMITER $ -- 声明存储过程的结束符

CREATE PROCEDURE pro_test() --存储过程名称(参数列表)

BEGIN

-- 可以写多个sql语句; -- sql语句+流程控制

SELECT * FROM employee;

END $ -- 结束 结束符

-- 执行存储过程

CALL pro_test(); -- CALL 存储过程名称(参数);

-- 删除存储过程DROP PROCEDURE pro_test;

带有输入参数的存储过程

需求:传入一个员工的id,查询员工信息

DELIMITER $

CREATE PROCEDURE pro_findById(IN eid INT) -- IN: 输入参数

BEGIN

SELECT * FROM employee WHERE id=eid;

END $

-- 调用

CALL pro_findById(4);

2. 带有输出参数的存储过程

DELIMITER $

CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20)) -- OUT:输出参数

BEGIN

-- 给参数赋值

SET str='hellojava';

END $

如何接受返回参数的值呢?这里涉及到MySQL的变量

MySQL变量一共有三种:

全局变量

全局变量又叫内置变量,是mysql数据库内置的变量 ,对所有连接都起作用。

查看所有全局变量: show variables

查看某个全局变量: select @@变量名

修改全局变量: set 变量名=新值

character_set_client: mysql服务器的接收数据的编码

character_set_results:mysql服务器输出数据的编码

会话变量

只存在于当前客户端与数据库服务器端的一次连接当中。如果连接断开,那么会话变量全部丢失!

定义会话变量: set @变量=值

查看会话变量: select @变量

局部变量

在存储过程中使用的变量就叫局部变量。只要存储过程执行完毕,局部变量就丢失。

回到上面这个存储过程,如何接受返回参数的值呢?

定义一个会话变量name, 使用name会话变量接收存储过程的返回值

CALL pro_testOut(@NAME);

查看变量值

SELECT @NAME;

3. 带有输入输出参数的存储过程

DELIMITER $CREATE PROCEDURE pro_testInOut(INOUT n INT) -- INOUT: 输入输出参数BEGIN

-- 查看变量

SELECT n;

SET n =500;END $

-- 调用SET @n=10;

CALL pro_testInOut(@n);

SELECT @n;

带有条件判断的存储过程

需求:输入一个整数,如果1,则返回“星期一”,如果2,返回“星期二”,如果3,返回“星期三”。其他数字,返回“错误输入”;

DELIMITER $CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20))BEGIN

IF num=1 THEN SET str='星期一';

ELSEIF num=2 THEN SET str='星期二';

ELSEIF num=3 THEN SET str='星期三';

ELSE SET str='输入错误';

END IF;END $

-调用

CALL pro_testIf(4,@str);

SELECT @str;

5. 带有循环功能的存储过程

需求: 输入一个整数,求和。例如,输入100,统计1-100的和

DELIMITER $CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)BEGIN

-- 定义一个局部变量

DECLARE i INT DEFAULT 1;

DECLARE vsum INT DEFAULT 0;

WHILE i<=num DO SET vsum = vsum+i;

SET i=i+1; END WHILE; SET result=vsum;

END $

--调用

CALL pro_testWhile(100,@result);

SELECT @result;

6. 使用查询的结果赋值给变量(INTO)

DELIMITER $CREATE PROCEDURE pro_findById2(IN eid INT,OUT vname VARCHAR(20) )BEGIN

SELECT empName INTO vname FROM employee WHERE id=eid;END $

--调用

CALL pro_findById2(1,@NAME);

SELECT @NAME;

二、 触发器

触发器作用:当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成。

需求: 当向员工表插入一条记录时,希望mysql自动同时往日志表插入数据

CREATE TRIGGER tri_empAdd AFTER INSERT ON employee FOR EACH ROW -- 当往员工表插入一条记录时

INSERT INTO test_log(content) VALUES('员工表插入了一条记录');

以上触发器是基于insert的,以下两个是基于update和delete的。

-- 创建触发器(修改)CREATE TRIGGER tri_empUpd AFTER UPDATE ON employee FOR EACH ROW -- 当往员工表修改一条记录时

INSERT INTO test_log(content) VALUES('员工表修改了一条记录');

-- 创建触发器(删除)CREATE TRIGGER tri_empDel AFTER DELETE ON employee FOR EACH ROW -- 当往员工表删除一条记录时

INSERT INTO test_log(content) VALUES('员工表删除了一条记录');

说明:

MySQL默认将分号,即“;”作为语句的分隔符。如果是这样的话,则一个存储过程将很难正常创建,因为它的BEGIN和END之间可以是任意数量的SQL语句,而每条SQL语句都以分号结束。所以,在创建存储过程时,必须重新定义分隔符。在上述用例中,均将“$”作为新的分隔符,注意,在创建完存储过程后,必须重新设置回原来的分隔符“;”

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

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

相关文章

mysql 扩展存储过程_MySQL4:存储过程和函数

什么是存储过程简单说&#xff0c;存储过程就是一条或多条SQL语句的集合&#xff0c;可视为批文件&#xff0c;但是起作用不仅限于批处理。本文主要讲解如何创建存储过程和存储函数以及变量的使用&#xff0c;如何调用、查看、修改、删除存储过程和存储函数等。使用的数据库和表…

netcore quartz job用不了services_.NetCore开源集成框架

GitHub地址&#xff1a;https://github.com/zwl568633995/AspNetCoreScaffolding&#xff08;感兴趣的Fork给个小星星吧~&#xff09;AspNetCoreScaffolding本框架在.netCore和.netStandard的基础上&#xff0c;集成了多种中间件.NetCore集成框架&#xff0c;即开即用如果对您有…

mysql基准性能测试标准_mysql性能测试与优化——(一),基准测试套件

笔者英语不好&#xff0c;又没人翻译&#xff0c;只好自己动手&#xff0c;希望大家多提意见&#xff0c;我好及时修改&#xff0c;以免误导他人。本文仅供参考&#xff0c;笔者对使用者产生的任何后果&#xff0c;概不负责。 转载请注明出处&#xff01;正文&#xff1a;The…

python合并数组输出重复项_python进行数组合并的方法

python的数组合并在算法题中用到特别多&#xff0c;这里简单总结一下&#xff1a;假设有a1和a2两个数组&#xff1a;a1[1,2,3]a2[4,5,6]合并方式1. 直接相加#合并后赋值给新数组a3a3 a1 a22. extend#调用此方法&#xff0c;a1会扩展成a1和a2的内容a1.extend(a2)3. 列表表达式…

mysql更新代码_mysql update语句的用法

1. 单表的UPDATE语句&#xff1a;UPDATE [LOW_PRIORITY] [IGNORE] tbl_nameSET col_name1expr1 [, col_name2expr2 ...][WHERE where_definition][ORDER BY ...][LIMIT row_count]2. 多表的UPDATE语句UPDATE [LOW_PRIORITY] [IGNORE] table_referencesSET col_name1expr1…

安装版mysql错误2_【gem安装】mysql2错误

错误信息Gem::Ext::BuildError: ERROR: Failed to build gem native extension./home/jaylin/.rvm/rubies/ruby-2.2.1/bin/ruby -r ./siteconf20150423-6190-1ocfncu.rb extconf.rbchecking for ruby/thread.h... yeschecking for rb_thread_call_without_gvl() in ruby/thread…

linux 父子进程 资源_linux 父子进程 资源_实验4 Linux父子进程同步

实验4 Linux父子进程同步【实验目的】(1)熟悉在c语言源程序中使用linux所提供的系统调用界面的方法。(2)理解同步的概念。(3)使用系统调用wait()和exit()&#xff0c;实现父子进程同步。【实验原理/实验基础知识】一、同步在多道系统中&#xff0c;一个进程相对于另一个进程的…

mysql事件循环执行,Node.js MySQL连接,查询顺序和事件循环

Lets see this exampleconn.query(SET v 1;, (err) > {conn.query(SELECT v;, (err, res) > {// res contains v 1 or 2 ?});});conn.query(SET v 2;, (err) > {conn.query(SELECT v;, (err, res) > {// res contains v 1 or 2 ?});});Does mysql/mysql2 nod…

mysql执行一条语句会加锁吗_一条简单的更新语句,MySQL是如何加锁的?

看如下一条sql语句&#xff1a;# table T (id int, name varchar(20))delete from T where id 10&#xff1b;MySQL在执行的过程中&#xff0c;是如何加锁呢&#xff1f;在看下面这条语句&#xff1a;select * from T where id 10&#xff1b;那这条语句呢&#xff1f;其实这…

mysql命令4类_【Mysql】mysql数据库的一些常用命令

一、启动与退出1、进入MySQL&#xff1a;输入命令&#xff1a;mysql -u root -p直接输入安装时的密码即可。此时的提示符是&#xff1a;mysql>2、退出MySQL&#xff1a;quit或exit3、数据库清屏命令&#xff1a;system clear;二、库操作1、创建数据库命令&#xff1a;create…

u2020 华为_华为MateBook X Pro 2020款评测:全面屏商务旗舰再升级

在今年2月24日举办的华为终端产品与战略线上发布会上&#xff0c;华为正式发布了全新升级的MateBook X Pro 2020款笔记本电脑&#xff0c;并且加入了翡冷翠新色&#xff0c;再一次的奠定了产品高端时尚基调。除此之外&#xff0c;华为MateBook X Pro 2020款还升级了第10代智能英…

java zip文件夹_如何使用java压缩文件夹成为zip包

展开全部在JDK中有一个zip工具类&#xff1a;java.util.zip Provides classes for reading and writing the standard ZIP andGZIP file formats.使用此类可以将文件夹或者多个文件进行打包压缩操作。在使用之前先了解62616964757a686964616fe59b9ee7ad9431333363376462关键…

java -uf_Java如何快速修改Jar包里的文件内容

需求背景&#xff1a;写了一个实时读取日志文件以及监控的小程序&#xff0c;打包成了Jar包可执行文件&#xff0c;通过我们的web主系统上传到各个服务器&#xff0c;然后调用ssh命令执行。每次上传前都要通过解压缩软件修改或者替换里面的配置文件&#xff0c;这样感觉有点麻烦…

java .vm h2_java-H2服务器在调试时挂起

由于正在创建内存数据库,因此启动tcp服务器将无济于事.我建议改为在线程中启动控制台,并在同一段代码(例如,使用jdbc)中打开与此数据库的连接,但不要关闭/释放它.使用此代码段执行此操作&#xff1a;请根据H2文档添加其他选项,例如允许其他人使用(我建议暂时将其保留)org.h2.to…

java 静态变量 new_java中静态对象和普通变量在初始化静态变量的时候有什么区别??高手!!...

下面有一个例子&#xff0c;将语句(6)直接改为一个新的对象后&#xff0c;结果会不同&#xff0c;解释的清楚一些吗&#xff1f;&#xff1f;豁出去了&#xff0c;家当10分publicclassStaticVariableTest{privatestaticStaticVariableTestsvtnewS...下面有一个例子&#xff0c;…

java子类怎么编译_java – 无法编译从基类实现抽象方法的子类

编译我已经定义的基类的子类有一个问题,它有一个单独的方法,而每个子类都实现了抽象基类方法,但是javac说他们甚至没有在子类中明确定义它们.DbModel.java(基类)package com.manodestra.db;import java.sql.ResultSet;import java.sql.SQLException;public abstract class DbMo…

java循环遍历类属性_java循环遍历类属性 get 和set值方法

//遍历sqspb类 成员为String类型 属性为空的全部替换为“/”Field[] fields sqspb.getClass().getDeclaredFields();for (int i 0; i < fields.length; i) {// 获取属性的名字String name fields[i].getName();// 将属性的首字符大写&#xff0c;方便构造get&#xff0c;…

java 浏览器 爬虫_java 网络编程-爬虫+模拟浏览器

网络爬虫模拟浏览器(获取有权限网站资源)&#xff1a;获取URL下载资源分析处理public class http {public static void main(String[]args) throws Exception{//https更安全//URL.openStream()打开于URL的连接&#xff0c;并返回一个InputStream用于从连接中读取数据//获取URLU…

java 序列化实例_Java中的序列化与反序列化实例

创建的字节流与平台无关。因此&#xff0c;在一个平台上序列化的对象可以在另一个平台上反序列化。为了使Java对象可序列化&#xff0c;我们实现java.io.Serializable可序列化接口。ObjectOutputStream类包含writeObject()序列化对象的方法。public final voidwriteObject(Obje…

java map for循环遍历_java中Map遍历的四种方式

java中Map遍历的四种方式在java中所有的map都实现了Map接口&#xff0c;因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方式去遍历。方法一&#xff1a;在for循环中使用entries实现Map的遍历&#xff1a;/*** 最常见也是大多数情况下用的最多的…