2012-04-29 18 views
6

Ich habe eine gespeicherte Prozedur erstellt. Ich möchte, dass die Daten nach verschiedenen Parametern gefiltert werden. Wenn ich einen Parameter übergebe, sollte er durch eins gefiltert werden; Wenn ich zwei übergebe, sollte es durch zwei gefiltert werden, und so weiter, aber es funktioniert nicht.MySQL gespeicherte Prozedur mit variabler Argumentliste

Kann mir jemand bitte helfen?

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; 

Antwort

9

AFAIK, Sie können nicht eine variable Argumentliste wie diese haben. Sie können eine von ein paar Dinge tun:

  1. Nehmen Sie eine feste maximale Anzahl von Parametern, und prüfen sie auf null-ness vor verketten:

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

    Wenn Sie Felder vorgegebenen müssen, welche die Kriterien in dem Argument gelten (wie der e_Region Parameter in Ihrem vorhandenen Code), dann ändern Sie die CONCAT-Operation entsprechend.

    Mögliche Aufruf:

    CALL SP_rptProvince2('''North''', 'column3 = ''South''') 
    
  2. einen einzelnen Parameter achten, dass viel größer als nur 45 Zeichen ist, und einfach hängen Sie ihn an die Abfrage (vorausgesetzt, es ist nicht null).

    Offensichtlich legt dies den Benutzer auf die Bereitstellung des richtigen SQL-Codes.

    Mögliche Aufruf:

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

Es gibt nicht viel zu zwischen den beiden zu wählen. Beide können zur Arbeit gebracht werden; keiner ist völlig befriedigend.

Sie könnten feststellen, dass die Zeichenfolgen in den Argumenten mit zusätzlichen Anführungszeichen geschützt werden mussten. Das ist die Art von Sache, die das problematisch macht.

+0

Vielen Dank für die Antwort. aber geben Sie mir diesen Fehler Lookup error-Mysql Database Error: Unbekannte Spalte 'South' in 'Where-Klausel' –

+2

Sie werden voraussichtlich für sich selbst denken. Ich weiß nicht aus deinem Kommentar, woher "South" kam; Ich weiß nicht aus Ihrer Frage, welcher Spalte Ihr zweites oder nachfolgende Argumente zugeordnet werden sollten; Ich kann nicht sagen, wie du es nennen willst. Sie müssen diese Art von Details ausfüllen und * denken * für sich selbst. –

+0

ich benutze dieses Verfahren für die Berichterstattung Ich habe 5 Parameter in dieser Prozedur, wenn ich einen Parameter nicht übergeben alle Daten sollten angezeigt werden, wenn ich einen Parameter übergeben die Ansicht sollte auf Basis von einem gefiltert werden und die anderen vier Parameter werden Null übergeben Wenn ich zwei Parameter übergeben habe, sollte die Ansicht durch zwei Parameter gefiltert werden und die anderen drei Parameter werden als Null übergeben. Dies ist das Konzept der Prozedur. Wenn Sie mir helfen könnten, das wird sehr geschätzt werden, ich bin neu zu mysql Ich habe das gleiche in SQL Server 2005 und es arbeitet dort, aber nicht hier in MySQL. –

Verwandte Themen