1、存储过程

MySQL中存储过程的参数中有IN、OUT、INOUT类型,但是函数的参数只能是IN类型的。

“in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者来说是不可见的。

DROP PROCEDURE IF EXISTS prol_pl;
DELIMITER $$#定义一个分解符
CREATE PROCEDURE prol_pl(
IN i1 INT
)
BEGIN
DECLARE d1 INT;#声明一个变量
DECLARE d2 INT DEFAULT 1;
SET d1 = i1 + d2;
SELECT * FROM employee WHERE id > d1;
END $$
DELIMITER ;
set @id = 10;
CALL prol_pl(@id); #调用存储过程 #结果为图1
SELECT * FROM employee WHERE id > @id;#结果为图2

可以看出虽然设置了变量id的值为1,但是在存储过程内部修改了id的值为2,id的值并未返回给调用者。(in也可以粗暴的理解为进入,必须传值)

“out” 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值。

 1 delimiter //
2
3 create procedure pr_test(out id int)
4 begin
5 if(id is not null)then set id = id + 1;
6 else set id = 0;
7 end if;
8 select id as in_id;
9 end;
10 //
11
12 delimiter ;
13
14 set @id = 10;
15
16 /*-----运行的结果in_id = 0-----*/
17 call pr_test(@id);
18
19 /*-----运行的结果in_id = 0-----*/
20 select @id as out_id;

可以看出虽然设置了变量id的值为10,但是在存储过程内部id的值为null,最后id的值在存储过程内修改后返回调用者。

inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout 参数传递值给存储过程。

 1 delimiter //
2
3 create procedure pr_test(inout id int)
4 begin
5 if(id is not null)then set id = id + 1;
6 else set id = 0;
7 end if;
8 select id as in_id;
9 end;
10 //
11
12 delimiter ;
13
14 set @id = 10;
15
16 /*-----运行的结果in_id = 11-----*/
17 call pr_test(@id);
18
19 /*-----运行的结果in_id = 11-----*/
20 select @id as out_id;

可以看出设置了变量id的值为10,在存储内部将id的值修改为11,最后id的值返回给调用者。

综合小练习:

DROP PROCEDURE IF EXISTS prol_p2;
DELIMITER $$
CREATE PROCEDURE prol_p2(
IN i1 INT,
INOUT ii INT,
OUT i2 int
)
BEGIN
DECLARE d2 int DEFAULT 1;
set ii = ii + 1;
IF i1 = 1 THEN
set i2 = 100 + d2;
ELSEIF i1 = 2 THEN
set i2 = 200 + d2;
ELSE
SET i2 = 1000 + d2;
END IF;
END $$
DELIMITER ; set @c=4;
CALL prol_p2(2,@c,@u);
SELECT @c,@u

结果为5,201

python操作存储过程

import pymysql
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='',db='article_spider')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#执行存储过程的查询结果
row = cursor.callproc('prol_p2',(1,2,3))
#获取存储过程查询结果
selc = cursor.fetchall()
print(selc)
#获取存储过程返回
effect_row = cursor.execute("select @_prol_p2_0,@_prol_p2_1,@_prol_p2_2")
#获取存储过程返回值
result = cursor.fetchone()
print(result)
conn.commit()

2、触发器

简单版

delimiter $$
DROP TRIGGER IF EXISTS tri_before_insert_color $$
CREATE TRIGGER tri_before_insert_color BEFORE INSERT ON color FOR EACH ROW
BEGIN
INSERT INTO employee(`name`,`depid`) VALUES('大佐','');
END $$
delimiter ;
INSERT INTO color(`name`) VALUES('red');

new

delimiter $$
DROP TRIGGER IF EXISTS tri_before_insert_color $$
CREATE TRIGGER tri_before_insert_color BEFORE INSERT ON color FOR EACH ROW
BEGIN
INSERT INTO employee(`name`,`depid`) VALUES(NEW.name,'');
END $$
delimiter ;
INSERT INTO color(name) VALUES('blue'),('orange');

old

delimiter $$
DROP TRIGGER IF EXISTS tri_before_insert_color $$
CREATE TRIGGER tri_before_del_color BEFORE DELETE ON color FOR EACH ROW
BEGIN
#IF NEW.name = 'red' THEN
INSERT INTO employee(`name`,`depid`) VALUES(OLD.NAME,'');
#END IF;
END $$
delimiter ;
DELETE FROM color WHERE id=2;

3、函数

自定义函数

delimiter $$
CREATE FUNCTION f1(
  s1 INT,
  s2 INT
)
RETURNS INT
BEGIN
  DECLARE num INT;
  set num = s1 + s2;
  RETURN(num);
END $$
delimiter ; select f1(11,22)

删除函数

drop function func_name;

4、事务处理

delimiter \\
create PROCEDURE p1(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback; #回滚
END; DECLARE exit handler for sqlwarning
BEGIN 开始事务
-- WARNING
set p_return_code = 2;
rollback;
END; START TRANSACTION;
DELETE from tb1;
insert into tb2(name)values('seven');
COMMIT; #提交 -- SUCCESS
set p_return_code = 0; END\\
delimiter ;

动态执行SQL语句

delimiter \\
DROP PROCEDURE IF EXISTS proc_sql \\
CREATE PROCEDURE proc_sql (
in strSql VARCHAR(128),
in nid int
)
BEGIN
set @p1 = nid;
set @sq1l = strSql; PREPARE prod FROM @sq1l;
EXECUTE prod USING @p1;
DEALLOCATE prepare prod; END\\
delimiter ; CALL proc_sql('select * from color where id > ?',1) #执行语句

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

  1. MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别

    1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...

  2. MySQL存储过程/存储过程与自定义函数的区别

    语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ...

  3. (转)MySQL存储过程/存储过程与自定义函数的区别

    转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE [definer = {user|current_user}]  ...

  4. 【存储过程】MySQL存储过程/存储过程与自定义函数的区别

    ---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer = {user|current_user ...

  5. MySQL学习——操作自定义函数

    MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...

  6. mysql存储过程和存储函数

    mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...

  7. mysql存储过程及常用函数

    原文:mysql存储过程及常用函数 一.函数 1.数学函数 CEIL()进一取整 SELECT CEIL(1.2);2 FLOOR()舍一取整 SELECT FLOOR(1.9);9 MOD取余数(取 ...

  8. Oracle存储过程和自定义函数

    新博客文章链接,欢迎大家评论探讨 概述 存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 异同点: 存储过程和存储函数的相同点:完成特定功能的程序. 存储过程和存储 ...

  9. mysql视图 触发器 事物 函数 存储过程

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  10. mysql 存储过程和存储函数

    14.1.1 创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristi ...

随机推荐

  1. linux下插入U盘自动挂载后,用C获取其挂载点(cat /proc/mounts)

    现在已经能够通过libudev获取U盘插入时它的节点名(通过函数udev_device_get_devnode()),是/dev/sdb1 我现在的做法是读取/proc/mounts文件,找到有/de ...

  2. chrome查看JavaScript的堆栈调用

    设置断点之后,查看的时候,注意右侧栏. 在调试按钮下方,有一个watch和call stack,

  3. fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习

      C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...

  4. java jar 服务自启动存在的坑及解决办法

    为了在服务器重启的时候,java程序能够自动重启,我们通常把它加到服务里面 ln -s /full/path/to/jar /etc/init.d/service_name # start servi ...

  5. 在WCF程序中动态修改app.config配置文件

    今天在个WCF程序中加入了修改配置文件的功能.我是直接通过IO操作修改的app.config文件内容,修改后发现发现其并不生效,用Google搜了一下,在园子里的文章动态修改App.Config 和w ...

  6. 旋转数组 空间复杂度为O(1) 的2 种方法 + 1种空间复杂度O(n)

    题目地址 : 旋转数组. 网上好多不是根本就是错的,就是空间复杂度不是真正为1 下面总结一下 方法1 普通方法(空间复杂度不满足要求,但是题目并不会判错,说明他们没用对空间进行校验) ··· publ ...

  7. 我写过的bug...

    添加对,更新和查询出错 因为只写了bean里只写了se't方法,没有写get 多条件联合查询,后一个条件没用 写xml里面复制上一行,忘记把变量名改了(propertyValue没改成register ...

  8. 阶段3 1.Mybatis_03.自定义Mybatis框架_7.自定义Mybatis的编码-实现基于注解配置的查询所有

    注解的方式,这里进行修改.上面注释的是原来xml的方式. 在dao类里面加上注解 创建注解类 声明注解的生命周期为Runntime 改变注解出现的位置,在Mehtod方法上 写完之后这里就不报错了. ...

  9. Tomcat使用介绍

    一.tomcat介绍 Tomcat服务器是一个免费的开放源代码的轻量级Web 应用服务器,如apache处理静态HTML能力突出不同,tomcat处理动态HTML能力相当强大,因此一般项目都是部署ap ...

  10. windows 使用Docker Desktop 使用国内镜像

    ===新增一些比较给力的镜像=== 1.中科大镜像加速地址 https://docker.mirrors.ustc.edu.cn 2.阿里云镜像服务 ========= 原本在配置项中添加了:国内镜像 ...