Mysql 创建函数不起作用

标签 mysql sql function

我尝试在我的 mysql server 5.5 中创建这个函数,我从 mysql 中得到标准错误:

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 5

CREATE FUNCTION isInArea(p POINT, poly POLYGON)
    RETURNS INT(1)
    DETERMINISTIC
    BEGIN
        DECLARE n INT DEFAULT 0;
        DECLARE pX DECIMAL(9, 6);
        DECLARE pY DECIMAL(9, 6);
        DECLARE ls LINESTRING;
        DECLARE poly1 POINT;
        DECLARE poly1X DECIMAL(9, 6);
        DECLARE poly1Y DECIMAL(9, 6);
        DECLARE poly2 POINT;
        DECLARE poly2X DECIMAL(9, 6);
        DECLARE poly2Y DECIMAL(9, 6);
        DECLARE i INT DEFAULT 0;
        DECLARE result INT(1) DEFAULT 0; 
        SET 
            pX = X(p); 
        SET 
            pY = Y(p); 
        SET 
            ls = ExteriorRing(poly); 
        SET 
            poly2 = EndPoint(ls); 
        SET 
            poly2X = X(poly2); 
        SET 
            poly2Y = Y(poly2); 
        SET 
            n = NumPoints(ls); WHILE i < n DO 
        SET 
            poly1 = PointN(
                ls, 
                (i + 1)
            ); 
        SET 
            poly1X = X(poly1); 
        SET 
            poly1Y = Y(poly1); IF (
                (
                    (
                        (poly1X <= pX) && (pX < poly2X)
                    ) || (
                        (poly2X <= pX) && (pX < poly1X)
                    )
                ) && (
                    pY > (poly2Y - poly1Y) * (pX - poly1X) / (poly2X - poly1X) + poly1Y
                )
            ) THEN 
        SET 
            result = ! result; END IF; 
        SET 
            poly2X = poly1X; 
        SET 
            poly2Y = poly1Y; 
        SET 
            i = i + 1;
        END WHILE;
        RETURN result;
    End;

有人知道这个问题吗?

最佳答案

Add delimiter :

Each stored program contains a body that consists of an SQL statement. This statement may be a compound statement made up of several statements separated by semicolon (;) characters.

If you use the mysql client program to define a stored program containing semicolon characters, a problem arises. By default, mysql itself recognizes the semicolon as a statement delimiter, so you must redefine the delimiter temporarily to cause mysql to pass the entire stored program definition to the server.

DELIMITER //
CREATE FUNCTION isInArea(p POINT, poly POLYGON)
    RETURNS INT(1)
    DETERMINISTIC
    BEGIN
        DECLARE n INT DEFAULT 0;
        DECLARE pX DECIMAL(9, 6);
        DECLARE pY DECIMAL(9, 6);
        DECLARE ls LINESTRING;
        DECLARE poly1 POINT;
        DECLARE poly1X DECIMAL(9, 6);
        DECLARE poly1Y DECIMAL(9, 6);
        DECLARE poly2 POINT;
        DECLARE poly2X DECIMAL(9, 6);
        DECLARE poly2Y DECIMAL(9, 6);
        DECLARE i INT DEFAULT 0;
        DECLARE result INT(1) DEFAULT 0; 
        SET 
            pX = X(p); 
        SET 
            pY = Y(p); 
        SET 
            ls = ExteriorRing(poly); 
        SET 
            poly2 = EndPoint(ls); 
        SET 
            poly2X = X(poly2); 
        SET 
            poly2Y = Y(poly2); 
        SET 
            n = NumPoints(ls); WHILE i < n DO 
        SET 
            poly1 = PointN(
                ls, 
                (i + 1)
            ); 
        SET 
            poly1X = X(poly1); 
        SET 
            poly1Y = Y(poly1); IF (
                (
                    (
                        (poly1X <= pX) && (pX < poly2X)
                    ) || (
                        (poly2X <= pX) && (pX < poly1X)
                    )
                ) && (
                    pY > (poly2Y - poly1Y) * (pX - poly1X) / (poly2X - poly1X) + poly1Y
                )
            ) THEN 
        SET 
            result = ! result; END IF; 
        SET 
            poly2X = poly1X; 
        SET 
            poly2Y = poly1Y; 
        SET 
            i = i + 1;
        END WHILE;
        RETURN result;
    End//


DELIMITER ;

关于Mysql 创建函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33605524/

相关文章:

mysql - 在备份中包含 ib_logfiles?

php - 将数据保存到数据库后隐藏按钮

java - 由于外键的空值而无法从表中获取数据

sql - 将database.bak从本地机器恢复到服务器

mysql min where 语句

php - PayPal txn_id IPN 检查

php - 代码点火器 AND OR AND

c - 函数名称周围的括号是什么意思?

mysql - 在MySQL中获取当前正在执行的存储过程名称?

c# - 数组作为函数参数 c 到 c# 的混淆