MySQL存储过程及触发器

来源:互联网 发布:电台司令 评价 知乎 编辑:程序博客网 时间:2024/05/16 07:17

一、存储过程

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

复制代码
-- 声明结束符-- 创建存储过程DELIMITER $  -- 声明存储过程的结束符CREATE PROCEDURE pro_test()    --存储过程名称(参数列表)BEGIN    -- 可以写多个sql语句;      -- sql语句+流程控制    SELECT * FROM employee;END $  -- 结束 结束符-- 执行存储过程CALL pro_test();   -- CALL 存储过程名称(参数);-- 删除存储过程DROP PROCEDURE pro_test;参数:IN:   表示输入参数,可以携带数据带存储过程中OUT: 表示输出参数,可以从存储过程中返回结果INOUT: 表示输入输出参数,既可以输入功能,也可以输出功能
复制代码

 

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

    需求:传入一个员工的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;
复制代码

 

4. 带有条件判断的存储过程

需求:输入一个整数,如果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('员工表删除了一条记录');
复制代码

 

说明:

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头发长油怎么办小妙招 头发出油多脱发怎么办 头发出油掉头发怎么办 在英国狂掉头发怎么办 我头发油头皮痒脱发怎么办 油性头发容易掉发怎么办 洗了头发很蓬松怎么办 小孩头皮黄掉头发怎么办 头发又油又掉发怎么办 英国的水掉头发怎么办 洗发为什么会掉头发怎么办 头发老掉怎么办吃什么 19岁掉头发严重怎么办 头发总是从根掉怎么办 18岁掉头发很厉害怎么办 20岁脱发严重该怎么办 22岁m型脱发严重怎么办 22掉头发很厉害怎么办 哺乳期头发掉的很厉害怎么办 失眠多梦掉头发怎么办 老婆生完孩子掉头发怎么办 16岁发际线高怎么办 生了小孩头发掉怎么办 16岁头发掉的厉害怎么办 经常脱发严重不长头发怎么办 产后3年一直脱发怎么办 生完宝宝头发掉怎么办 生完小孩掉好多头发怎么办 脱发头发掉的厉害怎么办 宝宝四个月妈妈掉头发怎么办 产后四个月掉头发怎么办 洗头时严重掉发怎么办 头发老是掉得到处都是怎么办 短发洗完头头发向外外怎么办 20岁掉头发厉害怎么办 20岁老掉头发怎么办 20岁有点掉头发怎么办 20岁开始掉头发怎么办 20岁掉头发严重怎么办 20岁脱发很严重怎么办 手的纹路很深怎么办