美文网首页
关于MySQL function创建的限制

关于MySQL function创建的限制

作者: GreatSQL | 来源:发表于2022-02-28 09:45 被阅读0次
  • 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 :)

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

相关文章

  • 关于MySQL function创建的限制

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 MySQL 的function创建会...

  • This function has none of DETEMI

    在MySQL中创建function的时候出现了"ERROR 1418 (HY000): This function...

  • This function has none of DETERM

    今天在mysql中创建函数的时候,报错如下: ERROR 1418 (HY000): This function ...

  • 2017.01.01

    黑龙江广电mysql数据库函数创建 DROP FUNCTION IF EXISTS `func_split`; D...

  • 8.23 cascade

    1.Cascade Function 正常创建fk之后,如果删除主表的pk,受constraint限制,是会报错的...

  • 存储过程

    MYSQL中创建存储过程和函数分别使用CREATE PROCEDURE和CREATE FUNCTION 使用CAL...

  • mysql ERROR 1418 (HY000): This f

    在mysql中创建自定义函数时出现的错误 ERROR 1418 (HY000): This function ha...

  • ES6相关

    关于变量提升 var 创建、初始化 被提升 let、const 创建 被提升 function 创建、初始化、赋值...

  • function的创建

    1.首先初始化一个scope chain 空间,创建fn空间。 2.创建variable 3.首先function...

  • MySQL创建函数时报This function has non

    命令行下: 这样添加参数后,如果mysql服务器重启,上述参数又会消失。需要永久生效,则需要在my.ini或my....

网友评论

      本文标题:关于MySQL function创建的限制

      本文链接:https://www.haomeiwen.com/subject/fdflrrtx.html