7

私は現在 PHP で使用している関数を持っています。これは、別々のフィールドから郵送先住所をコンパイルしますが、さまざまな地域で使用されるさまざまな形式を考慮に入れています。これをMySQLストアド関数として複製しようとしています。多くの場合、この種のことをデータベースではなくコードで行う方が速いことはわかっていますが、イントラネットには、生の MySQL SELECT コマンドを読み取り専用で入力する方法があり、高度な検索を構築してクエリを保存できます。この特定の関数は、ユーザーが高度な検索クエリの結果をラベル レイアウトに出力できるようにするために使用されます。

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もインストールしましたが、同じエラーが発生しましたが、「'END'近くのSQL構文エラー」も強調表示されているため、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 行目は END IF、RETURN、および END 句の近くにありますが、これに問題があることはわかりません。

MySQL Workbench と phpMyAdmin の両方でこの問題の原因を特定できる人はいますか?
関数を保存したら、それをテストしてロジックを微調整できます。

また、合理化できる機能があれば教えてください。そこには多くの例がないので、これに多少パッチを当てました。

4

3 に答える 3

9

わかりました私は自分の質問に答えるつもりです。Yahia のおかげで、IF ステートメントの構文をもう一度見直しました。
クエリを台無しにしてしまったことが判明しました。

上記の2つELSE IFの句があります。http://dev.mysql.com/doc/refman/5.0/en/if.html
による適切な構文は、実際には、ドキュメントから実際に確認せずに、スペースも使用する必要があると 想定しています.ELSEIF
END IFELSE IF

そのため、MySQL は ELSE IF を ELSE として正確に解釈し、その後、同じレベルの別のブランチではなく、別のネストされた IF の開始を解釈していました。

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

だからすべて私のせいでRTM

于 2012-01-28T23:30:43.267 に答える
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 ;

よろしく。

于 2012-12-09T20:39:18.663 に答える
3

がありません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;;
于 2012-01-28T22:03:27.447 に答える