创建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》视频课程

戳此小程序即可直达B站

https://www.bilibili.com/medialist/play/1363850082?business=space_collection&business_id=343928&desc=0



文章推荐:


想看更多技术好文,点个“在看”吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值