我们都知道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/

mysql实现oracle存储过程默认参数的更多相关文章

  1. Oracle存储过程 输出参数赋值异常:“Oracle.DataAccess.Types.OracleString”的类型初始值设定项引发异常。

    场景: 写了一个有返回参数的存储过程,在个另开发人员机器上都正常.其它机器报如题错误.让人郁闷的是,所有调用方都是客户端,根本不存在网上众贴所说的版本不一致问题. 分析: 虽然网上的帖子没有根本解决问 ...

  2. oracle存储过程(带参数的存储过程)

    带参数的存储过程 举例:为指定的员工涨100元的工资,打印涨前和涨后的工资 如果带参,需要指定是输入参数还是输出参数 create or replace procedure raisesalary(e ...

  3. oracle存储过程含参数的插入数据

    create or replace procedure proczipcodebyzipinsert(   i_zipcode  in  zipcode.zip%type,   i_city in z ...

  4. MySQL 和 Oracle 在 MyBatis 使用中的区别

    MySQL 和 Oracle 在 MyBatis 使用中的区别: 区别 MySQL Oracle 存储过程的参数模式 mode 为 IN 时,是否需要指定 jdbcType 不需要:MyBatis 为 ...

  5. Oracle存储过程创建及调用(转)

    在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器.在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的.相对来说,数据库系统中的触发器也是一种存储 ...

  6. oracle存储过程 --1

    一,oracle存储过程语法   1.oracle存储过程结构  CREATE OR REPLACE PROCEDURE oracle存储过程名字 (     参数1 IN NUMBER,     参 ...

  7. mysql与oracle的存储过程有什么区别?

    MySQL存储过程 (1). 格式 MySQL存储过程创建的格式:CREATE PROCEDURE过程名 ([过程参数[,...]]) [特性 ...]过程体 案例分析: 参数 MySQL存储过程的参 ...

  8. (转)oracle 存储过程 带游标作为OUT参数输出

    (转)oracle 存储过程 带游标作为OUT参数输出 存储过程返回OUT参数的游标 例子. 包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 ...

  9. MySQL与Oracle 差异比较之五存储过程&Function

    存储过程&Function 编号 类别 ORACLE MYSQL 注释 1 创建存储过程语句不同 create or replace procedure P_ADD_FAC(   id_fac ...

随机推荐

  1. 个人项目(java实现)

    一.github地址:https://github.com/Moyjing/Moy 二.psp表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实 ...

  2. PHP实现微信退款功能

    最近在调微信退款接口,发现有许多坑,更大家分享一下 ① 要是在测试的时候,网页提示 curl 58 说明 证书的路径出现问题(这里要填物理路径,也就是绝对路径) ②网页提示curl 52 说明你的证书 ...

  3. thrift简单示例 (基于C++)

    这个thrift的简单示例, 来源于官网 (http://thrift.apache.org/tutorial/cpp), 因为我觉得官网的例子已经很简单了, 所以没有写新的示例, 关于安装的教程, ...

  4. Linux_安装maven

    安装maven 1.首先要已经安装JDK 2.下载安装包,可以安装包下: 下载地址:https://mirrors.cnnic.cn/apache/maven/ wget https://mirror ...

  5. springboot在idea的RunDashboard如何显示出来

    找到.idea文件下的workspace.xml,并找到RunDashboard 加入如下配置 <option name="configurationTypes"> & ...

  6. 回调方式进行COM组件对外消息传递

    情景:被调用者--COM组件:调用者---外部程序作用:COM组件 到 外部程序 的消息传递方法: 1.外部程序通过接口类对象,访问接口类的方法.COM对象通过连接点方式,进行消息的反向传递. 2.外 ...

  7. Centos7 Mysql主从双机热备的实战记录

    操作系统:centos7 服务器:主:172.19.242.69   从:172.19.242.70 1. 服务器 由于Mysql不同版本之间的(二进制日志)binlog格式可能会不太一样,因此最好的 ...

  8. HDU4091:Zombie’s Treasure Chest (分类-数学)

    题意:给两种宝石,体积S1,S2,价值V1,V2,背包容量n,求最大收益. 所有数据都在32位整数范围内. 思路:只有两种物品的背包,显然不是常见的背包,应该从背包之外的思路下手. 1:可以猜想其中一 ...

  9. Zabbix4.0国内下载源

    国内zabbix源总结 目前发现的有以下几个站点: 1.阿里巴巴开源镜像站(推荐使用) 地址:https://mirrors.aliyun.com/zabbix/ 2.华为开源镜像站(推荐使用) 地址 ...

  10. AST11103 Problem Solving

    AST11103 Problem Solving with Programming SkillsAdditional Individual Assignment: Min-Game Programmi ...