zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    linux学习第一周笔记
    三授权六禁令(必背)
    内存复用三种技术
    移动平台路径相关
    unitUnity优化技巧
    游戏开发优化建议
    转载, unity 如何自定义脚本
    unity animation 在播放动画时报错 The animation state Eat could not be played because it couldn't be found!
    unity 学习之前需要做的准备
    xml 操作遇到的坑
  • 原文地址:https://www.cnblogs.com/zhjh256/p/10987076.html
Copyright © 2011-2022 走看看