2012-01-28 19 views
5

Ho una funzione che attualmente utilizzo in PHP che compila un indirizzo postale da campi separati ma tiene conto di diversi formati utilizzato in diverse regioni. Sto cercando di replicare questo come una funzione memorizzata MySQL. Mi rendo conto che è spesso più veloce fare questo genere di cose in codice piuttosto che nel database, ma la nostra intranet ha un modo per le persone di immettere comandi MySQL SELECT in sola lettura in modo da poter costruire ricerche avanzate e salvare le query. Questa particolare funzione verrà utilizzata in modo che gli utenti possano inviare i risultati delle query di ricerca avanzate a un layout di etichetta.Funzione memorizzata MySQL con IF annidato END IF, errore di sintassi, sintassi corretta da utilizzare vicino a ''

Quando provo e memorizzare la funzione utilizzando phpMyAdmin 3.4.9 (ultima versione stabile) ottengo il seguente errore:

#1064 - 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 '' at line 51 

Inoltre ho installato l'ultima MySQL Workbench e ottengo lo stesso errore, ma anche che sia evidenziato un "Errore di sintassi SQL vicino a 'END'" quindi non è solo un bug in phpMyAdmin (anche se potrebbe essere un bug in phpMyAdmin e MySQL Workbench).

Ecco la query funzione di:

DELIMITER ;; 
DROP FUNCTION IF EXISTS ADDRESS_BUILD;; 
CREATE FUNCTION ADDRESS_BUILD(contact VARCHAR(50), company VARCHAR(100), add1 VARCHAR(255), add2 VARCHAR(255), add3 VARCHAR(255), town_city VARCHAR(50), county_state VARCHAR(50), postcode_zip VARCHAR(50), country VARCHAR(100), `separator` VARCHAR(10), type VARCHAR(10)) 
RETURNS TEXT 
DETERMINISTIC 
BEGIN 
DECLARE address TEXT; 
DECLARE line TEXT; 

IF LENGTH(TRIM(contact))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(contact)); END IF; 
IF LENGTH(TRIM(company))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(company)); END IF; 
IF LENGTH(TRIM(add1))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add1)); END IF; 
IF LENGTH(TRIM(add2))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add2)); END IF; 
IF LENGTH(TRIM(add3))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(add3)); END IF; 

IF country='United States of America' OR country='USA' OR country='Canada' OR country='CA' THEN 
    /* NORTH AMERICA, ALL ON 1 LINE */ 
    IF LENGTH(TRIM(town_city))>0 THEN 
     IF type='mail' THEN SET line=CONCAT_WS('', TRIM(town_city), ' '); 
     ELSE SET line=CONCAT_WS('', line, TRIM(town_city), ', '); 
     END IF; 
    END IF; 

    IF LENGTH(TRIM(county_state))>0 THEN 
     IF type='mail' THEN SET line=CONCAT_WS('', line, TRIM(county_state), ' '); 
     ELSE SET line=CONCAT_WS('', line, TRIM(county_state), ' '); 
     END IF; 
    END IF; 

    IF LENGTH(TRIM(postcode_zip))>0 THEN SET line=CONCAT_WS('', line, TRIM(postcode_zip)); END IF; 

    SET address=CONCAT_WS(`separator`, address, TRIM(line)); 

ELSE IF country='United Kingdom' OR country='UK' THEN 
    /* UK, ASCENDING LOCALITY SEPARATE LINES */ 
    IF LENGTH(TRIM(town_city))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(town_city)); END IF; 
    IF LENGTH(TRIM(county_state))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(county_state)); END IF; 
    IF LENGTH(TRIM(postcode_zip))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(postcode_zip)); END IF; 

ELSE 
    /* EUROPE EVERYWHERE ELSE, ALL ON 1 LINE POSTCODE FIRST */ 
    IF LENGTH(TRIM(postcode_zip))>0 THEN SET line=CONCAT_WS('', line, TRIM(postcode_zip)); END IF; 
    IF LENGTH(TRIM(town_city))>0 THEN SET line=CONCAT_WS('', line, ' ', TRIM(town_city)); END IF; 
    IF LENGTH(TRIM(county_state))>0 THEN SET line=CONCAT_WS('', line, ' ', TRIM(county_state)); END IF; 
    IF LENGTH(TRIM(line))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(line)); END IF; 
END IF; 

IF country='United States of America' THEN SET address=CONCAT_WS(`separator`, address, 'USA'); 
ELSE IF LENGTH(TRIM(country))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(country)); 
END IF; 

RETURN address; 
END;;

Linea 51 è vicino alla fine se, clausole RETURN e fine, ma non riesco a individuare nulla di sbagliato in questo.

Qualcuno può vedere che cosa sta causando questo problema in MySQL Workbench e phpMyAdmin?
Una volta memorizzata la funzione, posso verificarla e modificare la logica.

Inoltre, se c'è qualcosa nella funzione che potrebbe essere semplificata, fatemelo sapere. Non ci sono molti esempi là fuori, quindi ho messo insieme un po 'questo.

risposta

7

Ok ho intenzione di rispondere alla mia domanda. Grazie a Yahia ho dato un'altra occhiata alla sintassi della mia IF statement.
Risulta Ho rovinato la query!

Ho 2 clausole ELSE IF sopra.
La sintassi corretta secondo http://dev.mysql.com/doc/refman/5.0/en/if.html è effettivamente ELSEIF
Ho appena assunto che a causa di END IF che dovrebbe anche essere ELSE IF con uno spazio, senza realmente assicurandosi dalla documentazione.

Quindi MySQL interpretava correttamente ELSE IF come ELSE quindi l'inizio di un altro IF annidato, invece di un altro ramo dello stesso livello.

La query precedente funziona perfettamente in phpMyAdmin dopo aver corretto i SE ELSE ma ho apportato alcune modifiche alla logica da eseguire.

Quindi tutta colpa mia e RTM!

2

vi manca un END IF; - cambiare le ultime righe per:

IF country='United States of America' THEN SET address=CONCAT_WS(`separator`, address, 'USA'); 
ELSE IF LENGTH(TRIM(country))>0 THEN SET address=CONCAT_WS(`separator`, address, TRIM(country)); 
END IF; 
END IF; 

RETURN address; 
END;; 
+0

No, ho paura :( – batfastad

+0

@batfastad Che 'FINE SE;' forse non è l'unica cosa che manca ... ma non ho installato MySQL per verificarlo ... – Yahia

+0

Abbastanza corretto, I Controlleremo rapidamente che i miei nidificazioni si abbinino. – batfastad

5

Altra soluzione. Prova con una funzione:

DROP FUNCTION IF EXISTS test; 

DELIMITER $$ 
CREATE FUNCTION test(name VARCHAR(255), id INT) RETURNS INT 
BEGIN 
    DECLARE var_resp INT DEFAULT 0; 

    IF (LENGTH(TRIM(name)) > 0) THEN 
     UPDATE mytableset IDName= name WHERE mytable.ID = id 
     SET var_resp = 1; 
    END IF; 

    RETURN var_resp; 

END $$ 
DELIMITER ; 

Saluti.

Problemi correlati