私はこれをグーグルで調べて、「いいえ、それは不可能です」と考え続けていますが、これらの投稿は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でできることはまだまだたくさんあるからです。
それはまだ不可能です。
ストアドプロシージャに単純な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
_SET myParam = IFNULL(myParam, 0);
_
説明:IFNULL(expression_1, expression_2)
_expression_1
_がIFNULL
ではない場合、NULL
関数は_expression_1
_を返します。それ以外の場合は、_expression_2
_を返します。 IFNULL
関数は、使用されているコンテキストに基づいて文字列または数値を返します。
最新のMySQLバージョンの CREATE PROCEDURE構文 を調べると、プロシージャパラメータにはIN/OUT/INOUT指定子、パラメータ名、およびタイプのみを含めることができます。
そのため、デフォルト値は最新のMySQLバージョンではまだ利用できません。
残念ながら、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()
プロシージャのパラメーター。
いいえ、これはMySQLストアドルーチン構文ではサポートされていません。
bugs.mysql.com で機能リクエストを送信してください。