77

私はこれをグーグルで調べて、「いいえ、それは不可能です」と考え続けていますが、これらの投稿は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 でできることはもっとたくさんあるからです。

4

6 に答える 6

80

それはまだ不可能です。

于 2009-06-11T18:29:41.027 に答える
53

ストアド プロシージャに単純な 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
于 2012-07-09T23:34:56.373 に答える
12

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

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

于 2009-06-11T18:34:58.520 に答える
5

DEFAULT残念ながら、MySQLはパラメータ値をサポートしていないため、次のようになります。

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()

于 2012-10-02T16:02:09.373 に答える
1

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

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

于 2009-06-11T18:40:13.810 に答える