wake-up-neo.com

Ist es möglich, einen Standardparameter für eine gespeicherte MySQL-Prozedur zu haben?

Ich habe das gegoogelt und finde immer wieder "Nein, das ist nicht möglich", aber diese Posts wurden vom 2005-2007 datiert, also frage ich mich, ob dies geändert wurde. Ein Codebeispiel:

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

Eine der Lösungen bestand darin, null zu übergeben, auf null zu prüfen und die Variable festzulegen. Ich möchte das nicht und ich sollte es auch nicht müssen. Wenn dies zutrifft, müssen MySql-Entwickler aufwachen, da ich mit MSSQL noch so viel mehr tun kann.

63
aarona

Es ist immer noch nicht möglich.

65
Paul Sonier

Wir haben diese Einschränkung umgangen, indem wir der gespeicherten Prozedur eine einfache IF-Anweisung hinzugefügt haben. Praktischerweise übergeben wir eine leere Zeichenfolge, wenn wir den Standardwert in der DB speichern möchten.

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

Erläuterung: IFNULL(expression_1, expression_2)

Die Funktion IFNULL gibt expression_1 Zurück, wenn expression_1 Nicht NULL ist; Andernfalls wird expression_2 zurückgegeben. Die Funktion IFNULL gibt eine Zeichenfolge oder eine Zahl zurück, die auf dem Kontext basiert, in dem sie verwendet wird.

21
SKManX

Wenn Sie sich CREATE PROCEDURE Syntax für die neueste MySQL-Version ansehen, werden Sie feststellen, dass der Prozedurparameter nur den IN/OUT/INOUT-Bezeichner, den Parameternamen und den Typ enthalten kann.

Standardwerte sind daher in der neuesten MySQL-Version immer noch nicht verfügbar.

11
Michael

Leider unterstützt MySQL keine DEFAULT -Parameterwerte.

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

gibt den Fehler zurück:

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

Um diese Einschränkung zu umgehen, erstellen Sie einfach zusätzliche Prozeduren, die der ursprünglichen Prozedur Standardwerte zuweisen:

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

Führen Sie dann Folgendes aus:

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

wird zurückkehren:

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

Wenn Sie dann sicherstellen, dass Sie nur die Prozeduren blah2(), blah1() und blah0() verwenden, muss Ihr Code beim Hinzufügen eines dritten nicht sofort aktualisiert werden Parameter für die Prozedur blah().

4
Ross Smith II

Nein, dies wird in der gespeicherten MySQL-Routinesyntax nicht unterstützt.

Sie können gerne eine Funktionsanfrage an bugs.mysql.com senden.

1
Bill Karwin