乐趣区

关于mysql:关于MySQL-function创建的限制

  • GreatSQL 社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。

MySQL 的 function 创立会有各种限度,常常应用的语句的限度如下:

1、CONTAINS_DYNAMIC_SQL

CREATE function f1() returns int 
BEGIN
  set @cmd = 'select * from t1';
  PREPARE stmt1 FROM @cmd;
  EXECUTE IMMEDIATE @cmd;
  return 1;
END;

SQL Error [1336] [0A000]: Dynamic SQL is not allowed in stored function or trigger

如果在 function 创立的时候蕴含 PREPARE,EXECUTE, DEALLOCATE,那么这些都会被判断为蕴含 DYNAMIC SQL,这些语法都会被回绝。因为应用存储过程的目标是避免应用严格类型的数据进行 SQL 注入。这个例子外面的 sql 语句是固定的,曾经脱离了 prepare 的应用意义,因而不须要创立这种场景。。

2、MULTI_RESULTS

CREATE function f1() returns int 
BEGIN
  select * from tb_tmp;
  return 1;
END;

SQL Error [1415] [0A000]: Not allowed to return a result set from a function

这里 select 语句会返回多行后果,而 function 只能容许返回一个固定后果,因而这种状况也不容许。

3、HAS_COMMIT_OR_ROLLBACK

CREATE function f1() returns int 
BEGIN
  commit;
  return 1;
END;

SQL Error [1422] [HY000]: Explicit or implicit commit is not allowed in stored function or trigger.

因为在 procedure 的 set x=fi() 的场景外面,一个 set 语句蕴含了 begin work 和 commit work,如果 f1 有 commit 的话会影响事务前面的治理。

4、其余状况

除了以上状况还有另外 2 种也会被回绝:别离是 HAS_SQLCOM_RESETHAS_SQLCOM_FLUSH。应用时候留神避开。

5、补充阐明

在 procedure 中一条蕴含 begin 和 commit 的语句除了下面提到的 set,还有 IF, CASE, DECLARE, RETURN,这些命令创立时候都会设置 open_tables=true,而后执行 open_and_lock_tables,当执行完子命令再进行 rollback 或者 commit 操作。

Enjoy GreatSQL :)

深入浅出 MGR 专栏

1.MGR 简介 | 深入浅出 MGR
https://mp.weixin.qq.com/s/lb…

2. 组复制技术架构 | 深入浅出 MGR
https://mp.weixin.qq.com/s/6_…

3. 装置部署 MGR 集群 | 深入浅出 MGR
https://mp.weixin.qq.com/s/Nh…

4. 利用 MySQL Shell 装置部署 MGR 集群 | 深入浅出 MGR
https://mp.weixin.qq.com/s/51…

5.MGR 治理保护 | 深入浅出 MGR
https://mp.weixin.qq.com/s/D5…

文章举荐:

MySQL 主从复制原理及搭建过程
https://mp.weixin.qq.com/s/X2…

MySQL 主从复制之 GTID 模式介绍
https://mp.weixin.qq.com/s/9g…

MySQL 主从复制之半同步 (semi-sync replication)
https://mp.weixin.qq.com/s/Bh…

Linux 环境监控工具汇总
https://mp.weixin.qq.com/s/SY…

MySQL Test Run 测试框架介绍
https://mp.weixin.qq.com/s/JA…

对于 GreatSQL

GreatSQL 是由万里数据库保护的 MySQL 分支,专一于晋升 MGR 可靠性及性能,反对 InnoDB 并行查问个性,是实用于金融级利用的 MySQL 分支版本。

Gitee:
https://gitee.com/GreatSQL/Gr…

GitHub:
https://github.com/GreatSQL/G…

Bilibili:
https://space.bilibili.com/13…

微信 &QQ 群:
可搜寻增加 GreatSQL 社区助手微信好友,发送验证信息“加群”退出 GreatSQL/MGR 交换微信群

QQ 群:533341697
微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 公布!

退出移动版