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存储过程、触发器、自定义函数、事务相关推荐

  1. oracle创建包 和调用,oracle创建函数和调用存储过程和调用函数的例子(区别)...

    创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; ...

  2. sqlserver 只有函数和扩展存储过程才能从函数内部执行

    一个SQLServer的自定义函数中调用一个自定义的存储过程,执行此函数后发出如下提示:"只有函数和扩展存储过程才能从函数内部执行". 原因:函数只能使用简单的sql语句,逻辑控制 ...

  3. mysql 存储过程代码_MySQL存储过程及常用函数代码解析

    mysql存储过程的概念: 存储在数据库当中可以执行特定工作(查询和更新)的一组SQL代码的程序段. mysql函数的概念: 函数是完成特定功能的SQL语句,函数分为内置函数和自定义函数(user-d ...

  4. mysql 函数 局部变量_MySQL 存储过程 存储函数 局部变量 游标 概念示例

    一个存储过程是一个可编程的函数,它可以在MySQL中创建并保存.它是由一些SQL语句和一些特殊的控制结构语句组成. 当希望在不同的应用程序或平台上执行相同的函数,或者封装特定的功能时,存储过程是一个非 ...

  5. mysql 事务 视图 存储过程 触发器

    一 ,mysql事务 MYSQL中只有INNODB类型的数据表才能支持事务处理. 启动事务有两种方法 (1) 用begin,rollback,commit来实现 begin 开始一个事务rollbac ...

  6. mysql游标 原理解说_mysql存储过程之游标(DECLARE)原理与用法详解

    本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法.分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每 ...

  7. mysql数据库内置函数大全_MySQL数据库——内置函数

    MySQL数据库--内置函数 建表并插入数据 create table student( id char(36) primary key, name varchar(8) not null, age ...

  8. mysql innodb 事务_MySQL学习笔记之InnoDB事务实现

    我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式. 同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. 所以 ...

  9. mysql mvcc 读写阻塞_mysql面试题MVCC原理事务隔离级别_aiailingfei的博客-CSDN博客

    原文作者:小小一只鸟 原文标题:mysql面试题MVCC原理事务隔离级别 发布时间:2021-01-19 19:43:38 mysql事务隔离级别可重复读面试题 熊大 话说今天漂亮的妹子给我发过一张图 ...

  10. mysql中discount用法_MySQL 技巧:COALESCE 函数的使用

    COALESCE() 函数可以接收多个参数,并返回第一个非 NULL 的参数.如果所有参数都为 NULL,则 COALESCE() 函数返回 NULL. 例如: COALESCE(NULL, 1, 2 ...

最新文章

  1. python调用libs.dbutil_Python 使用 PyMysql、DBUtils 创建连接池,提升性能
  2. Mysql多表查询(案例2)
  3. 安卓机更新系统会卡吗_iOS13.3系统值得更新吗?信号怎么样?续航改善了没有?...
  4. 【Python】find()函数居然还能指定搜索的起点和终点?
  5. telnet服务器显示本机,记一次困扰了我一个月的服务器telnet故障是如何解决的?...
  6. linux源码安装apache2,CentOS7编译安装Apache2
  7. 篇幅达2840页、目录就有31页,这位华人小哥的博士论文堪比教材
  8. Windows Azure 将正式更名为 Microsoft Azure
  9. 中国新能源汽车供应链白皮书2020
  10. Android屏幕适配和文字屏幕适配
  11. yolo如何降低loss_你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (上)...
  12. 我的专属QQ 功能篇 (一)
  13. android x86 安装到u盘分区,安卓X86 U盘启动盘制作教程 PC体验Android x86 4.0系统
  14. SpringCloud第八章:Gateway新一代网关
  15. 元旦给计算机老师发贺词,给老师的元旦祝福语
  16. mongodb仲裁者_真理的仲裁者
  17. C语言求整数的绝对值
  18. Linux下TCP网络编程-创建服务器与客户端
  19. mysql大批量数据插入技巧
  20. Unable to prepare *** iPhone for development

热门文章

  1. linux中线程ptid,Linux 线程(1)线程创建
  2. 768页,最牛笔记曝光!
  3. c语言中栈的作用,栈(Stack)的概念和应用及C语言实现
  4. 压缩软件自动化测试,FOR…IN…ZIP循环——自动化测试精解(14)
  5. 最优化设置mysql的max_connections
  6. IDEA 导入Weka的Maven依赖jar包
  7. python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)...
  8. Kubernetes 架构(上)- 每天5分钟玩转 Docker 容器技术(120)
  9. Android使用软引用和弱引用
  10. 为Windows Phone SDK 模拟器安装应用