mysql实现oracle存储过程默认参数

我们都知道oracle存储过程支持为参数设置默认值,这样即使存储过程升级,原来的调用也可以不受影响。但是mysql不支持,mariadb也没有支持(截止10.4也是如此)。但是这一限制会导致升级麻烦重重。虽然如此,我们可以通过mysql 5.7/mariadb 10.2引入的json类型来变通实现。如下所示:

复制代码
drop function number_stats;
CREATE FUNCTION number_stats(in_numbers JSON)
    RETURNS INTEGER
    NOT DETERMINISTIC
    CONTAINS SQL
    COMMENT 'Accept an array of integers and their median'
BEGIN
    DECLARE v_count INT UNSIGNED
        DEFAULT JSON_LENGTH(in_numbers);
    RETURN JSON_EXTRACT(
        in_numbers,
        CONCAT('$[', FLOOR(v_count / 2), ']')
    );
END;
复制代码

 

复制代码
mariadb> select number_stats('[1,2,3,4]');

+---------------------------+
| number_stats('[1,2,3,4]') |
+---------------------------+
|                         3 |
+---------------------------+
1 row in set

mariadb> select JSON_VALUE('{ "x": [0,1], "y": "[0,1]", "z": "Monty" }','$.z');
+----------------------------------------------------------------+
| JSON_VALUE('{ "x": [0,1], "y": "[0,1]", "z": "Monty" }','$.z') |
+----------------------------------------------------------------+
| Monty                                                          |
+----------------------------------------------------------------+
1 row in set

mariadb> select JSON_VALUE('{ "x": [0,1], "y": "[0,1]", "z": "Monty" }','$.x
');
+----------------------------------------------------------------+
| JSON_VALUE('{ "x": [0,1], "y": "[0,1]", "z": "Monty" }','$.x') |
+----------------------------------------------------------------+
| NULL                                                           |
+----------------------------------------------------------------+
1 row in set

mariadb> select JSON_VALUE('{ "x": [0,1], "y": "[0,1]", "z": "Monty" }','$.y
');
+----------------------------------------------------------------+
| JSON_VALUE('{ "x": [0,1], "y": "[0,1]", "z": "Monty" }','$.y') |
+----------------------------------------------------------------+
| [0,1]                                                          |
+----------------------------------------------------------------+
1 row in set
复制代码

https://federico-razzoli.com/variable-number-of-parameters-and-optional-parameters-in-mysql-mariadb-procedures

https://mariadb.com/kb/en/library/json_extract/

 

posted @   zhjh256  阅读(1392)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2018-06-06 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
点击右上角即可分享
微信分享提示