MySQL 存储函数:包含 SQL 还是没有 SQL?

Posted

技术标签:

【中文标题】MySQL 存储函数:包含 SQL 还是没有 SQL?【英文标题】:MySQL stored function: CONTAINS SQL or NO SQL? 【发布时间】:2013-02-18 15:32:04 【问题描述】:

对于下面的存储函数,哪个是正确的标志:CONTAINS SQL 还是 NO SQL?

CREATE FUNCTION BigIntHash(str VARCHAR(255)) RETURNS BIGINT UNSIGNED DETERMINISTIC
RETURN CONV(SUBSTRING(CAST(SHA(str) AS CHAR), 1, 15), 16, 10)

CREATE FUNCTION upi(a VARCHAR(14), b INT(8) UNSIGNED, c VARCHAR(13)) RETURNS BIGINT UNSIGNED DETERMINISTIC
RETURN IF(a IS NULL, 
  IF(b IS NULL, 
    IF(c IS NULL, 
      NULL, 
      BigIntHash(CONCAT("a-", a))
    ), 
    BigIntHash(CONCAT("b-", b))
  ), 
  BigIntHash(CONCAT("c-", c))
)

定义在http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html,但我仍然不确定:

CONTAINS SQL 表示例程不包含读取或写入数据的语句。如果没有明确给出这些特征,则这是默认设置。此类语句的示例是 SET @x = 1 或 DO RELEASE_LOCK('abc'),它们执行但既不读取也不写入数据。

NO SQL 表示例程不包含 SQL 语句。

【问题讨论】:

【参考方案1】:

两者都是NO SQL,因为它们不访问表、游标或变量中的数据。

有关什么构成 SQL 语句的参考,请参阅:http://dev.mysql.com/doc/refman/5.1/en/sql-syntax.html

请注意,本章未提及 CONV() SHA()CONCAT() 等函数。

【讨论】:

以上是关于MySQL 存储函数:包含 SQL 还是没有 SQL?的主要内容,如果未能解决你的问题,请参考以下文章

Learning-MySQL:视图触发器存储过程函数流程控制

mysql视图,存储过程,函数,事务,触发器,以及动态执行sql

sq 语句 查询两个表 并按时间字段排序

MySQL基础--存储过程和函数

MySQL练习题

MySQL 存储函数不会使用 MODIFIES SQL DATA 编译