2009-06-11 10 views
49

Ho cercato su Google e continuo a proporre "No, non è possibile", ma questi post erano datati 2005-2007, quindi mi chiedo se questo è stato modificato. Un esempio di codice:È possibile avere un parametro predefinito per una procedura memorizzata mysql?

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

Una delle soluzioni è stato quello di passare null e quindi controllare per nulla e impostare la variabile. Non voglio farlo e non dovrei farlo. Se questo è vero, gli sviluppatori MySql devono svegliarsi perché c'è molto di più che posso fare con MSSQL.

+1

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

+0

mariaDB ha lo stesso problema? –

risposta

55

Non è ancora possibile.

+5

C'è qualche soluzione? Come verificare se il parametro è nullo e dargli un valore predefinito? – papaiatis

+1

@papaiatis Sì, puoi semplicemente aggiungere una dichiarazione if, vedi il mio altro post qui sotto. – Dive50

+3

Non so perché questa sia la risposta accettata quando di seguito qui @ Dive50 ha una soluzione alternativa utile, che sto per implementare perché sto affrontando lo stesso problema. – f1r3br4nd

10

Se si esamina CREATE PROCEDURE Syntax per la versione più recente di MySQL, si vedrà che il parametro della procedura può contenere solo identificatore IN/OUT/INOUT, nome parametro e tipo.

Quindi, i valori predefiniti non sono ancora disponibili nell'ultima versione di MySQL.

1

No, questo non è supportato nella sintassi di routine memorizzata MySQL.

Sentitevi liberi di inviare una richiesta di funzionalità a bugs.mysql.com.

+2

Inserendo questo messaggio dall'altra domanda che ho posto: http://bugs.mysql.com/bug.php?id=15975 – DJTripleThreat

36

Abbiamo aggirato questa limitazione aggiungendo una semplice istruzione IF nella stored procedure. Praticamente passiamo una stringa vuota ogni volta che vogliamo salvare il valore predefinito nel DB.

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

    ...your code here... 
END 
+4

Perché non usare invece 'null'? – Pacerier

+1

questo mostra quanto amore puoi dare a mysql, nel frattempo in sql puoi semplicemente mettere "param_name int (11) = NULL" ... grazie Oracle – Shide

4

Purtroppo, MySql non supporta DEFAULT i valori dei parametri, in modo da:

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

restituisce l'errore:

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 

Per aggirare questa limitazione, semplicemente creare ulteriori procedure che assegnano valori predefiniti alla procedura originale:

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

Poi, l'esecuzione di questo:

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

tornerà:

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

Quindi, se si assicurarsi di utilizzare solo le procedure blah2(), blah1() e blah0(), il codice non dovrà essere immediatamente aggiornato, quando si aggiunge un terzo parametro alla procedura blah().

12
SET myParam = IFNULL(myParam, 0); 

Spiegazione: IFNULL(expression_1, expression_2)

La funzione IFNULL ritorna expression_1 se expression_1 non è NULL; altrimenti restituisce expression_2. La funzione IFNULL restituisce una stringa o un valore numerico in base al contesto in cui viene utilizzato.

Problemi correlati