2009-06-11 4 views
49

Ich habe dies gegoogelt und immer wieder mit "Nein, es ist nicht möglich", aber diese Beiträge wurden 2005-2007 datiert, also frage ich mich, ob dies geändert wurde. Ein Codebeispiel:Ist es möglich, einen Standardparameter für eine gespeicherte MySQL-Prozedur zu haben?

Eine der Lösungen bestand darin, Null zu übergeben und dann auf Null zu überprüfen und die Variable festzulegen. Ich will das nicht tun und ich sollte es nicht müssen. Wenn das stimmt, müssen MySql-Entwickler aufwachen, weil es so viel mehr gibt, was ich mit MSSQL machen könnte.

+1

duplizieren: http://stackoverflow.com/questions/12652241/writing-optional-parameters-within-stored-procedures-in-mysql –

+0

hat mariaDB das gleiche Problem? –

Antwort

55

Es ist immer noch nicht möglich.

+5

Gibt es eine Problemumgehung? Wie überprüfe ich, ob der Parameter null ist, dann gib ihm einen Standardwert? – papaiatis

+1

@papiatis Ja, Sie können einfach eine if-Anweisung hinzufügen, siehe unten meinen anderen Beitrag. – Dive50

+3

Ich weiß nicht, warum dies die akzeptierte Antwort ist, wenn hier unten @ Dive50 eine nützliche Problemumgehung hat, die ich implementieren werde, da ich das gleiche Problem habe. – f1r3br4nd

10

Wenn Sie CREATE PROCEDURE Syntax für die neueste MySQL-Version betrachten, sehen Sie, dass der Prozedurparameter nur IN/OUT/INOUT-Spezifizierer, Parametername und -typ enthalten kann.

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

1

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

Fühlen Sie sich frei, eine Feature-Anfrage bei bugs.mysql.com einzureichen.

+2

Das von der anderen Frage stellend, die ich fragte: http://bugs.mysql.com/bug.php?id=15975 – DJTripleThreat

36

Wir haben diese Einschränkung umgangen, indem wir in der Stored Procedure eine einfache IF-Anweisung hinzugefügt haben. Praktisch übergeben wir eine leere Zeichenfolge, wenn wir den Standardwert in der Datenbank 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 
+4

Warum nicht 'null' statt verwenden? – Pacerier

+1

Dies zeigt, wie viel Liebe Sie mysql geben können, in der Zwischenzeit können Sie einfach "param_name int (11) = NULL" setzen ... danke Oracle – Shide

4

Leider MySQL unterstützt keine DEFAULT Parameterwerte, so:

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

gibt den Fehler:

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, einfach zusätzliche Verfahren erstellen, zuweisen Standardwerte für das ursprüngliche Verfahren:

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

Dann wird diese ausgeführt wird:

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

zurückkehren wird:

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

Dann, wenn Sie nur die blah2(), blah1() und blah0() Verfahren verwenden stellen Sie sicher, wird Ihr Code nicht sofort sein müssen aktualisiert, wenn Sie der Prozedur blah() einen dritten Parameter hinzufügen.

12
SET myParam = IFNULL(myParam, 0); 

Erläuterung: IFNULL(expression_1, expression_2)

Die IFNULL Funktion gibt expression_1 wenn expression_1 nicht NULL ist; Andernfalls gibt es expression_2 zurück. Die Funktion IFNULL gibt basierend auf dem Kontext, in dem sie verwendet wird, eine Zeichenfolge oder eine Zahl zurück.

Verwandte Themen