关于MySQL function创建的限制
2022/3/1 8:21:36
本文主要是介绍关于MySQL function创建的限制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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_RESET
、HAS_SQLCOM_FLUSH
。使用时候注意避开。
5、补充说明
在procedure中一条包含begin和commit的语句除了上面提到的set,还有IF, CASE, DECLARE, RETURN,这些命令创建时候都会设置open_tables=true,然后执行open_and_lock_tables,当执行完子命令再进行rollback或者commit操作。
Enjoy GreatSQL :)
这篇关于关于MySQL function创建的限制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16MySQL资料:新手入门教程
- 2024-11-16MySQL资料:新手入门教程
- 2024-11-15MySQL教程:初学者必备的MySQL数据库入门指南
- 2024-11-15MySQL教程:初学者必看的MySQL入门指南
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程