存储过程和函数在mysql数据库中有什么区别

函数必须返回单个值。
存储过程不直接返回值,但可以通过输出参数或结果集返回值。
函数直接在SQL语句中调用,而存储过程则需要CALL语句。
函数仅支持 IN 参数,存储过程支持 IN/OUT/INOUT 参数。
函数用于单一计算,存储过程用于复杂的逻辑和事务控制。

选择正确的工具,不要混合使用。

MySQL 递归查找树形结构,这个方法太实用了!

您可以直接使用存储函数在树结构中进行递归搜索。
说白了就是用GROUP_CONCAT合并子节点,然后用FIND_IN_SET一层一层的挖出来。

我上周刚刚处理了这个要求。
该表有三个字段,i_id主键、p_id父ID和c_name。
设计非常标准。

有两个关键函数:GROUP_CONCAT将子节点ID字符串化为字符串,而FIND_IN_SET可以查找字符串中的值。
结合这两个函数可以实现递归。

首先看一下 getSubNodes 函数,它使用 CONCAT_GROUP 来检查直接子节点。
然后getAllSubNodes函数循环调用getSubNodes,逐层挖掘。

但说实话,这样的递归在大量数据上会很慢。
我一般不建议超过五级的递归。
最好对p_id建立索引。

返回的是一个逗号分隔的字符串。
您可以使用FIND_IN_SET在外部处理它。
或者直接注册以请求节点信息。

在MySQL8 .0+中使用CTE真的很容易。
但旧版本只能使用存储函数。
这取决于您选择的数据库环境。

你考虑过递归深度的问题吗?

mysql自定义函数

那天在咖啡馆里,邻桌的程序员皱着眉头看着屏幕,嘀咕道:“怎么这次时间函数又出错了?”他正在调试一个自定义的MySQL函数,与书中的一模一样,但结果是错误的。
我看了一下他的代码,发现我忘记改DELIMITER了。
整个函数被当作一条普通的SQL语句,分号一个接一个地运行。

例如,对于分钟舍入功能,DELIMITER 必须在 BEGIN 之前设置一次,在 END 之后设置一次。
我帮他改了,他试了三遍。
第一次报错说TIME_TO_SEC is not recognize,第二次参数类型不正确,第三次终于成功了。
他这才明白:“哦,原来是这样啊!” ——其实他前一天就已经看过这一段了,只不过他没有注意到分号。

调试功能类似于煮咖啡。
如果第一次加太多糖,就会变得太甜。
如果第二次水温太高,底部就会变软。
一位程序员说:“调试函数最烦人的是,如果逻辑正确,就会抛出错误信息。
”我告诉他,“那是因为MySQL的执行顺序很严格,你定义的函数必须先创建出来,然后才能调用。

他突然问,“如果我要创建一个根据用户级别自动打折的函数,我该怎么写呢?”我随口说道:“CASE语句和你刚才的一样。
”他不断地问:“如果用户级别有很多级别怎么办?”我愣了一下,突然想到,“如果超过1 4 级,就会自动降级……”
现在想想,用户自定义函数就像用SQL做笔记一样。
以前,检查订单金额时,总是要写三行: SELECT Price 0.9 AS Discounted_price... 现在有了折扣功能,就只有一行: SELECTCalculate_discount(price, 'VIP')。
但有时我还是怀念以前的方法。
毕竟,函数中的 CASE 语句怎么能像直接的那样令人满意呢?乘以0.8 ?
等等,如果这个功能用在电商网站上,用户A在东京浏览商品,用户B在上海购物,计算出来的VIP折扣会一样吗?或者DEFINER函数的分辨率是否会影响真实用户看到的计算结果?