mysql 自定义函数 事务_MySQL存储过程、触发器、自定义函数、事务
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 DEFAULT1;
set ii= ii + 1;
IF i1= 1THEN
set i2= 100 +d2;
ELSEIF i1= 2THEN
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操作存储过程
importpymysql
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('大佐','104');
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,'105');
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,'105');#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)
View Code
删除函数
drop function func_name;
View Code
4、事务处理
delimiter \\
create PROCEDURE p1(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handlerforsqlexception
BEGIN--ERROR
set p_return_code= 1;
rollback;#回滚
END;
DECLARE exit handlerforsqlwarning
BEGIN 开始事务--WARNING
set p_return_code= 2;
rollback;
END;
START TRANSACTION;
DELETEfromtb1;
insert into tb2(name)values('seven');
COMMIT;#提交
--SUCCESS
set p_return_code=0;
END\\
delimiter ;
View Code
动态执行SQL语句
delimiter \\
DROP PROCEDURE IF EXISTS proc_sql \\
CREATE PROCEDURE proc_sql (in strSql VARCHAR(128),innid 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 自定义函数 事务_MySQL存储过程、触发器、自定义函数、事务相关推荐
- oracle创建包 和调用,oracle创建函数和调用存储过程和调用函数的例子(区别)...
创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; ...
- sqlserver 只有函数和扩展存储过程才能从函数内部执行
一个SQLServer的自定义函数中调用一个自定义的存储过程,执行此函数后发出如下提示:"只有函数和扩展存储过程才能从函数内部执行". 原因:函数只能使用简单的sql语句,逻辑控制 ...
- mysql 存储过程代码_MySQL存储过程及常用函数代码解析
mysql存储过程的概念: 存储在数据库当中可以执行特定工作(查询和更新)的一组SQL代码的程序段. mysql函数的概念: 函数是完成特定功能的SQL语句,函数分为内置函数和自定义函数(user-d ...
- mysql 函数 局部变量_MySQL 存储过程 存储函数 局部变量 游标 概念示例
一个存储过程是一个可编程的函数,它可以在MySQL中创建并保存.它是由一些SQL语句和一些特殊的控制结构语句组成. 当希望在不同的应用程序或平台上执行相同的函数,或者封装特定的功能时,存储过程是一个非 ...
- mysql 事务 视图 存储过程 触发器
一 ,mysql事务 MYSQL中只有INNODB类型的数据表才能支持事务处理. 启动事务有两种方法 (1) 用begin,rollback,commit来实现 begin 开始一个事务rollbac ...
- mysql游标 原理解说_mysql存储过程之游标(DECLARE)原理与用法详解
本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法.分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每 ...
- mysql数据库内置函数大全_MySQL数据库——内置函数
MySQL数据库--内置函数 建表并插入数据 create table student( id char(36) primary key, name varchar(8) not null, age ...
- mysql innodb 事务_MySQL学习笔记之InnoDB事务实现
我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式. 同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. 所以 ...
- mysql mvcc 读写阻塞_mysql面试题MVCC原理事务隔离级别_aiailingfei的博客-CSDN博客
原文作者:小小一只鸟 原文标题:mysql面试题MVCC原理事务隔离级别 发布时间:2021-01-19 19:43:38 mysql事务隔离级别可重复读面试题 熊大 话说今天漂亮的妹子给我发过一张图 ...
- mysql中discount用法_MySQL 技巧:COALESCE 函数的使用
COALESCE() 函数可以接收多个参数,并返回第一个非 NULL 的参数.如果所有参数都为 NULL,则 COALESCE() 函数返回 NULL. 例如: COALESCE(NULL, 1, 2 ...
最新文章
- python调用libs.dbutil_Python 使用 PyMysql、DBUtils 创建连接池,提升性能
- Mysql多表查询(案例2)
- 安卓机更新系统会卡吗_iOS13.3系统值得更新吗?信号怎么样?续航改善了没有?...
- 【Python】find()函数居然还能指定搜索的起点和终点?
- telnet服务器显示本机,记一次困扰了我一个月的服务器telnet故障是如何解决的?...
- linux源码安装apache2,CentOS7编译安装Apache2
- 篇幅达2840页、目录就有31页,这位华人小哥的博士论文堪比教材
- Windows Azure 将正式更名为 Microsoft Azure
- 中国新能源汽车供应链白皮书2020
- Android屏幕适配和文字屏幕适配
- yolo如何降低loss_你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (上)...
- 我的专属QQ 功能篇 (一)
- android x86 安装到u盘分区,安卓X86 U盘启动盘制作教程 PC体验Android x86 4.0系统
- SpringCloud第八章:Gateway新一代网关
- 元旦给计算机老师发贺词,给老师的元旦祝福语
- mongodb仲裁者_真理的仲裁者
- C语言求整数的绝对值
- Linux下TCP网络编程-创建服务器与客户端
- mysql大批量数据插入技巧
- Unable to prepare *** iPhone for development
热门文章
- linux中线程ptid,Linux 线程(1)线程创建
- 768页,最牛笔记曝光!
- c语言中栈的作用,栈(Stack)的概念和应用及C语言实现
- 压缩软件自动化测试,FOR…IN…ZIP循环——自动化测试精解(14)
- 最优化设置mysql的max_connections
- IDEA 导入Weka的Maven依赖jar包
- python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)...
- Kubernetes 架构(上)- 每天5分钟玩转 Docker 容器技术(120)
- Android使用软引用和弱引用
- 为Windows Phone SDK 模拟器安装应用