2014-02-04 2 views
0

Я пытаюсь преобразовать эту пользовательскую функцию (взятую из MSSQL) и настроить ее так, чтобы я мог запускать ее MYSQL. Я сделал несколько попыток, но все, кажется, ошибка в переменной declare.Преобразование функции MSSQL в функцию MySQL

Я бегу следующую версию: 5.6.11-журнал - MySQL Community Server (GPL)

USE [DataGB] 
GO 
/****** Object: UserDefinedFunction [dbo].[FullPostCodeFix] Script Date: 11/20/2013  16:10:44 ******/ 
SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 


CREATE FUNCTION [dbo].[FullPostCodeFix] (@Postcode VARCHAR(20)) 
RETURNS VARCHAR(20) 

BEGIN 
/* 
Puts postcode into correct format if it is currently in any of the below formats 
AB12AA 
AB 12AA 
AB1 2AA 
AB 1 2AA 
Returns @Postcode 
*/ 

DECL ARE @District Varchar(50) 
DECLARE @Remainder Varchar(50) 
DECLARE @Sector Varchar(50) 

SET @District= CASE 
      WHEN LEN(@Postcode) - CHARINDEX(' ', REVERSE(@Postcode)) =  len(@Postcode) THEN SUBSTRING(@Postcode,1,(len(@Postcode) - 3)) 
      WHEN LEN(@Postcode) - CHARINDEX(' ', REVERSE(@Postcode)) < 3 THEN  SUBSTRING(@Postcode,1,(len(@Postcode) - 3)) 
      ELSE SUBSTRING(@Postcode, 0, LEN(@Postcode) - CHARINDEX(' ', REVERSE(@Postcode)) + 1) 
     END 


SET @District = dbo.PostcodeFix(@District) 

SET @Remainder= RIGHT(@Postcode,3) 

SET @Sector = @District + ' ' + LEFT(@Remainder,1) 

SET @Postcode = @District + ' ' + @Remainder 

RETURN @Postcode 

END 

Моя попытка создания версии MYSQL ниже:

CREATE FUNCTION FullPostCodeFix (Postcode VARCHAR(20)) 
RETURNS VARCHAR(20) 

BEGIN 


DECLARE District Varchar(50) 
DECLARE Remainder Varchar(50) 
DECLARE Sector Varchar(50) 

SET District= CASE 
      WHEN LEN(Postcode) - CHARINDEX(' ', REVERSE(Postcode)) =  len(Postcode) THEN SUBSTRING(Postcode,1,(len(Postcode) - 3)) 
      WHEN LEN(Postcode) - CHARINDEX(' ', REVERSE(Postcode)) < 3 THEN  SUBSTRING(Postcode,1,(len(Postcode) - 3)) 
      ELSE SUBSTRING(Postcode, 0, LEN(Postcode) - CHARINDEX(' ',  REVERSE(Postcode)) + 1) 
     END 

SET District = dbo.PostcodeFix(District) 

SET Remainder= RIGHT(Postcode,3) 

SET Sector = District + ' ' + LEFT(Remainder,1) 

SET Postcode = District + ' ' + Remainder 

RETURN Postcode 

END 

ошибка, Я получаю следующее:

Error Code: 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 'DECLARE Remainder Varchar(50) DECLARE Sector Varchar(50) 

Существует еще одна функция, называемая функцией «FullPostCodeFi Икс". Это моя попытка:

DELIMITER $$ 
CREATE FUNCTION PostCodeFix (strDistrict VARCHAR(20)) 
RETURNS VARCHAR(20) 
DETERMINISTIC 
BEGIN 
    DECLARE intASCII INTEGER; 
     SET strDistrict = LTRIM(strDistrict); 
     SET strDistrict = RTRIM(strDistrict); 

      IF LENGTH(strDistrict) > 4 OR LENGTH(strDistrict) = 0 THEN RETURN 'ERROR: ' + strDistrict; 
      ELSE 
       BEGIN 
        SET intASCII = ASCII(LEFT(strDistrict, 1)); 
        IF (intASCII > 47 AND intASCII < 58) THEN RETURN 'ERROR: ' + strDistrict; 
        ELSE 
         BEGIN 
          SET intASCII = ASCII(SUBSTRING(strDistrict, 2, 1)); 
          IF (intASCII > 47 AND intASCII < 58) THEN SET strDistrict = LEFT(strDistrict, 1) + ' ' + RIGHT(strDistrict, LENGTH(strDistrict)-1); 
           SET intASCII = ASCII(SUBSTRING(strDistrict, 3, 1)); 
          IF (intASCII < 48 OR intASCII > 57) AND (intASCII <> 32) THEN RETURN 'ERROR: ' + strDistrict; 
          ELSE IF LENGTH(strDistrict) < 4 THEN  SET strDistrict = LEFT(strDistrict, 2) + ' ' + RIGHT(strDistrict, LENGTH(strDistrict)-2); 
          END IF; 
         END IF; 
       RETURN strDistrict; 
      END IF; 
+2

'DECL ARE'? Это ошибка копирования/вставки или это действительно в вашей функции? –

+1

Какие ошибки вы получаете или какие функции вы не можете преобразовать? –

+0

К сожалению, это скопировать и вставить ошибку. – user1077250

ответ

2

ОК позволяет начать замену функций MS-SQL эквивалентными функциями MySQL.

MSSQL   MySQL 
LEN()   LENGTH() 
SUBTRING() SUBSTR() 
CHARINDEX() INSTR() 

ниже документация и список всех функций MySQL Струнные http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

Вот правильно MySQL синтаксис, что я проверил.

CREATE FUNCTION FullPostCodeFix (Postcode VARCHAR(20)) RETURNS VARCHAR(20) 
BEGIN 
    DECLARE district VARCHAR(50); 
    DECLARE remainder VARCHAR(50); 
    DECLARE sector VARCHAR(50); 
     IF LENGTH(Postcode) - INSTR(' ', REVERSE(Postcode)) = LENGTH(Postcode) THEN SET district = SUBSTR(Postcode,1,(LENGTH(Postcode) - 3)); 
     ELSEIF LENGTH(Postcode) - INSTR(' ', REVERSE(Postcode)) < 3 THEN SET district = SUBSTR(Postcode,1,(LENGTH(Postcode) - 3)); 
     ELSE SET district = SUBSTR(Postcode, 0, LENGTH(Postcode) - INSTR(' ',  REVERSE(Postcode)) + 1); 
     END IF; 
    SET District = dbo.PostcodeFix(District); 
    SET Remainder= RIGHT(Postcode,3); 
    SET Sector = CONCAT(District,' ',LEFT(Remainder,1)); 
    SET Postcode = CONCAT(District,' ',Remainder); 
    RETURN Postcode; 
END 

Вот ваша вторая функция

CREATE FUNCTION PostCodeFix (strDistrict VARCHAR(20)) 
RETURNS VARCHAR(20) 
DETERMINISTIC 
BEGIN 
    DECLARE intASCII INTEGER; 
     SET strDistrict = LTRIM(strDistrict); 
     SET strDistrict = RTRIM(strDistrict); 

      IF LENGTH(strDistrict) > 4 OR LENGTH(strDistrict) = 0 THEN RETURN 'ERROR: ' + strDistrict; 
      ELSE     
        SET intASCII = ASCII(LEFT(strDistrict, 1)); 
        IF (intASCII > 47 AND intASCII < 58) THEN RETURN 'ERROR: ' + strDistrict; 
        ELSE       
         SET intASCII = ASCII(SUBSTRING(strDistrict, 2, 1)); 
         IF (intASCII > 47 AND intASCII < 58) THEN SET strDistrict = LEFT(strDistrict, 1) + ' ' + RIGHT(strDistrict, LENGTH(strDistrict)-1); 
         END IF; 
         SET intASCII = ASCII(SUBSTRING(strDistrict, 3, 1)); 
         IF (intASCII < 48 OR intASCII > 57) AND (intASCII <> 32) THEN RETURN 'ERROR: ' + strDistrict; 
         ELSEIF LENGTH(strDistrict) < 4 THEN  SET strDistrict = LEFT(strDistrict, 2) + ' ' + RIGHT(strDistrict, LENGTH(strDistrict)-2); 
         END IF;       
        END IF; 
       RETURN strDistrict;     
      END IF; 
END 
+0

Спасибо, я заменил функцию эквивалентом MYSQL ... однако я все равно получаю ту же ошибку. Я правильно сформулировал переменные? – user1077250

+0

Поместите свой код MySQL в свой вопрос –

+0

Я отредактировал свой оригинальный вопрос. – user1077250

Смежные вопросы