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의 워크 벤치를 설치 얻을뿐만 아니라 그것은 강조 있어요 "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 조항이 거의 다하지만 난 그와 아무 잘못을 발견 할 수 없다.
누구든지 MySQL Workbench와 phpMyAdmin에서이 문제의 원인을 볼 수 있습니까?
일단 함수가 저장되면, 그것을 테스트하고 로직을 조정할 수 있습니다.
또한 간소화 할 수있는 기능이 있다면 알려주세요. 거기에 많은 예제가 없기 때문에 나는 이것을 함께 패치했습니다.
행운이 두렵다 : ( – batfastad
@batfastad 그 'END IF;'는 아마도 누락 된 유일한 것이 아니지만 ... MySQL을 설치해 놓고 체크 아웃 할 필요가 없습니다 ... – Yahia
공정하게, 나는 충분히 빨리 내 둥지가 일치하는지 확인합니다. – batfastad