GreatSQL社区

搜索

GreatSQL社区

关于MySQL function创建的限制

GreatSQL社区 已有 364 次阅读2022-8-24 10:41 |个人分类:技术分享|系统分类:运维实战

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 :)



评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-5-12 04:10 , Processed in 0.014780 second(s), 8 queries , Redis On.
返回顶部