Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于MySQL function创建的限制

关于MySQL function创建的限制

原创
作者头像
GreatSQL社区
发布于 2022-02-28 02:03:33
发布于 2022-02-28 02:03:33
1.2K00
代码可运行
举报
运行总次数:0
代码可运行
  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

MySQL 的function创建会有各种限制,经常使用的语句的限制如下:

1、CONTAINS_DYNAMIC_SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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操作。

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee:

https://gitee.com/GreatSQL/GreatSQL

GitHub:

https://github.com/GreatSQL/GreatSQL

Bilibili:

https://space.bilibili.com/1363850082/video

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验