Is it possible to have a default parameter for a mysql stored procedure?

前端 未结 6 987
情话喂你
情话喂你 2020-11-30 02:44

I have googled this and keep coming up with \"No it is not possible\" but these posts were dated 2005-2007 so I\'m wondering if this has been changed. A code example:

<
6条回答
  •  南笙
    南笙 (楼主)
    2020-11-30 03:21

    Unfortunately, MySQL doesn't support DEFAULT parameter values, so:

    CREATE PROCEDURE `blah`
    (
      myDefaultParam int DEFAULT 0
    )
    BEGIN
      -- Do something here
    END
    

    returns the error:

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
    that corresponds to your MySQL server version for the right syntax to use 
    near 'DEFAULT 0) BEGIN END' at line 3
    

    To work around this limitation, simply create additional procedures that assign default values to the original procedure:

    DELIMITER //
    
    DROP PROCEDURE IF EXISTS blah//
    DROP PROCEDURE IF EXISTS blah2//
    DROP PROCEDURE IF EXISTS blah1//
    DROP PROCEDURE IF EXISTS blah0//
    
    CREATE PROCEDURE blah(param1 INT UNSIGNED, param2 INT UNSIGNED)
    BEGIN
        SELECT param1, param2;
    END;
    //
    
    CREATE PROCEDURE blah2(param1 INT UNSIGNED, param2 INT UNSIGNED)
    BEGIN
        CALL blah(param1, param2);
    END;
    //
    
    CREATE PROCEDURE blah1(param1 INT UNSIGNED)
    BEGIN
        CALL blah2(param1, 3);
    END;
    //
    
    CREATE PROCEDURE blah0()
    BEGIN
        CALL blah1(4);
    END;
    //
    

    Then, running this:

    CALL blah(1, 1);
    CALL blah2(2, 2);
    CALL blah1(3);
    CALL blah0();
    

    will return:

    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      1 |      1 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      2 |      2 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      3 |      3 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      4 |      3 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    

    Then, if you make sure to only use the blah2(), blah1() and blah0() procedures, your code will not need to be immediately updated, when you add a third parameter to the blah() procedure.

提交回复
热议问题