web-dev-qa-db-ja.com

mysqlストアドプロシージャのデフォルトパラメータを持つことは可能ですか?

私はこれをグーグルで調べて、「いいえ、それは不可能です」と考え続けていますが、これらの投稿は2005年から2007年の日付であるため、これが変更されたかどうか疑問に思っています。コード例:

CREATE PROCEDURE `blah`
(
  myDefaultParam int = 0 -- This breaks the code for some reason
)
BEGIN
  -- Do something here
END

解決策の1つは、nullを渡し、nullをチェックして変数を設定することです。私はそれをしたくありませんし、する必要はありません。これが当てはまる場合は、MySQL開発者が目覚める必要があります。MSSQLでできることはまだまだたくさんあるからです。

63
aarona

それはまだ不可能です。

65
Paul Sonier

ストアドプロシージャに単純なIFステートメントを追加することにより、この制限を回避しました。実際には、デフォルト値をDBに保存する場合は常に空の文字列を渡します。

CREATE DEFINER=`test`@`%` PROCEDURE `myProc`(IN myVarParam VARCHAR(40))
BEGIN
  IF myVarParam = '' THEN SET myVarParam = 'default-value'; END IF;

  ...your code here...
END
45
Dive50
_SET myParam = IFNULL(myParam, 0);
_

説明:IFNULL(expression_1, expression_2)

_expression_1_がIFNULLではない場合、NULL関数は_expression_1_を返します。それ以外の場合は、_expression_2_を返します。 IFNULL関数は、使用されているコンテキストに基づいて文字列または数値を返します。

21
SKManX

最新のMySQLバージョンの CREATE PROCEDURE構文 を調べると、プロシージャパラメータにはIN/OUT/INOUT指定子、パラメータ名、およびタイプのみを含めることができます。

そのため、デフォルト値は最新のMySQLバージョンではまだ利用できません。

11
Michael

残念ながら、MySQLはDEFAULTパラメーター値をサポートしていません。

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

エラーを返します:

_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
_

この制限を回避するには、元のプロシージャにデフォルト値を割り当てる追加のプロシージャを作成するだけです。

_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;
//
_

次に、これを実行します:

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

戻ります:

_+--------+--------+
| 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)
_

次に、blah2()blah1()、およびblah0()プロシージャのみを使用するようにすれば、3番目を追加するときにコードをすぐに更新する必要はありません。 blah()プロシージャのパラメーター。

4
Ross Smith II

いいえ、これはMySQLストアドルーチン構文ではサポートされていません。

bugs.mysql.com で機能リクエストを送信してください。

1
Bill Karwin