2012-01-28 14 views
5

私は現在PHPで使用している別のフィールドからのメールアドレスをコンパイルする機能を持っていますが、異なる地域で使用されます。私はこれをMySQLストアド・ファンクションとして再現しようとしています。私は、データベースではなくコードでこのようなことを行うほうが速いことを認識していますが、私たちのイントラネットでは、人が読み込み専用でMySQL SELECTコマンドを入力して高度な検索を行い、クエリを保存できる方法があります。この特定の機能は、ユーザーが高度な検索クエリの結果をラベルレイアウトに出力できるように使用されます。入れ子IF付きのMySQLストアドファンクション... END IF、構文エラー、 ''の近くで使用する正しい構文

私がしようとするとphpMyAdminは3.4.9(最新の安定)を使用して関数を保存するとき、私は次のエラーを取得する:

#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 

私はまた、最新のMySQL Workbenchをインストールし、同じエラーが出るだけでなく、それが強調されています"SQL構文エラーが 'END'の近くにあるため、phpMyAdminのバグだけではありません(ただし、phpMyAdminとMySQL Workbenchの両方のバグかもしれません)。

はここで、関数のクエリです:

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

ライン51は、IF、RETURNとEND句ENDに近いですが、私はそれに何かを見つけることができません。

誰かがMySQL WorkbenchとphpMyAdminの両方でこの問題の原因を知ることができますか?
関数が格納されたら、それをテストしてロジックを微調整することができます。

また、合理化できる機能があれば教えてください。そこにはたくさんの例はありませんので、私はこれを幾分一緒にパッチしました。

答えて

7

[OK]をクリックします。 Yahiaのおかげで、IF文の構文をもう一度見ました。
私はクエリを台無しになったことがわかった!

私は上記の2つのELSE IF節を持っています。 http://dev.mysql.com/doc/refman/5.0/en/if.htmlに応じ
適切な構文は、私はちょうどのでEND IFで、それはまた、実際のドキュメントから確認せずに、スペースとELSE IFでなければならないことと仮定し、実際にELSEIF
です。

したがって、MySQLは、同じレベルの別のブランチではなく、別のネストされたIFのELSEとELSE IFの間をかなり正しく解釈していました。

上記のクエリは、ELSE IFを修正するとphpMyAdminで完全に機能しますが、作成するロジックにはいくつか微調整があります。

だから私のすべての欠陥とRTM

2

あなたは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; 
END IF; 

RETURN address; 
END;; 
+0

私は:( – batfastad

+0

は 'END IFは、その@batfastad怖いん運;、私は十分 – Yahia

+0

フェア...'、おそらく唯一欠けているものではありません...しかし、私はMySQLはそれをチェックアウトするためにインストールされていません。私の巣が合っていることを素早くチェックします。 – batfastad

5

その他の解決策。お試しください:

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 ; 

よろしくお願いします。

関連する問題