2012-04-29 42 views
6

Ho eseguito una stored procedure. Voglio che filtri i dati in base a parametri diversi. Se passo un parametro, dovrebbe essere filtrato di uno; se ne passo due, dovrebbe essere filtrato per due, e così via, ma non funziona.Procedura memorizzata MySQL con elenco argomenti variabile

Qualcuno può aiutarmi per favore?

DROP PROCEDURE IF EXISTS medatabase.SP_rptProvince2; 
CREATE PROCEDURE medatabase.`SP_rptProvince2`(
IN e_Region VARCHAR(45) 
) 
BEGIN 

DECLARE strQuery VARCHAR(1024); 
DECLARE stmtp VARCHAR(1024); 
    SET @strQuery = CONCAT('SELECT * FROM alldata where 1=1'); 
    IF e_region IS NOT NULL THEN 
    SET @strQuery = CONCAT(@strQuery, ' AND (regionName)'=e_Region); 
    END IF; 

PREPARE stmtp FROM @strQuery; 
EXECUTE stmtp; 
END; 

risposta

9

AFAIK, non è possibile avere un elenco di argomenti variabile come quello. Si può fare uno di un paio di cose:

  1. Prendete un numero massimo fisso di parametri, e verificare la null-ness prima concatenando:

    CREATE PROCEDURE SP_rptProvince2(a1 VARCHAR(45), a2 VARCHAR(45), ...) 
    
    ... 
    
        IF a1 IS NOT NULL THEN 
        SET @strQuery = CONCAT(@strQuery, ' AND ', a2); 
        END IF; 
    

    Se avete bisogno campi predeterminato per cui il i criteri nell'argomento si applicano (come il parametro e_Region nel codice esistente), quindi si modifica l'operazione CONCAT in modo appropriato.

    possibile invocazione:

    CALL SP_rptProvince2('''North''', 'column3 = ''South''') 
    
  2. prendere un singolo parametro che è molto più grande di soli 45 caratteri, e semplicemente aggiungerlo alla query (ammesso che non è nullo).

    Chiaramente, questo pone l'onere dell'utente di fornire il codice SQL corretto.

    possibile invocazione:

    CALL SP_rptProvince2('RegionName = ''North'' AND column3 = ''South''') 
    

Ci non è molto da scegliere tra i due. O può essere fatto funzionare; nessuno dei due è del tutto soddisfacente.

Si potrebbe notare che era necessario proteggere le stringhe negli argomenti con virgolette aggiuntive; questo è il genere di cose che rende questo problematico.

+0

Grazie per aver postato la risposta. ma dammi questo errore Ricerca errore-Errore database Mysql: colonna sconosciuta 'Sud' in 'clausola where' –

+2

Ci si aspetta che tu pensi. Non so dal tuo commento da dove provenga "South"; Non so dalla tua domanda su quale colonna debba essere associato il secondo o il successivo argomento; Non posso dire come vuoi chiamarlo. Devi compilare quel tipo di dettaglio e * pensare * per te stesso. –

+0

sto usando questa procedura per riferire che ho 5 parametri in questa procedura se non passo un parametro tutti i dati dovrebbero essere visualizzati se passo un parametro la vista dovrebbe essere filtrata sulla base di uno e gli altri quattro parametri saranno passati null se ho passato due parametri la vista dovrebbe essere filtrata da due parametri e gli altri tre parametri saranno passati null e quindi su questo è il concetto della procedura. se potessi aiutarmi sarà molto apprezzato sono nuovo a mysql ho fatto lo stesso in sqlserver 2005 e funziona lì ma non funziona qui in mysql. –

Problemi correlati