Mysql 存储过程 - 空间函数
Mysql Stored Procedure - Spatial functions
我想使用存储过程更新 mysql table 列。该列的数据类型为多边形(空间数据)
SET boundryData = (SELECT boundry FROM tbl_data WHERE tbl_id = currentRow);
SET updatedBoundry = ST_GeomFromText(boundryData);
给出并错误说提供给函数的数据无效,如果我硬编码相同的数据集如下,存储过程按预期工作
SET updatedBoundry = ST_GeomFromText('POLYGON((6.546269854000059 80.15311213900003,6.54627481600005 80.15298415800004,6.546251038000038 80.15310380500006,6.546269854000059 80.15311213900003))');
整个存储过程如下
CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`()
BEGIN
DECLARE rowCount INT;
DECLARE boundryData longtext;
DECLARE currentRow INT;
DECLARE updatedBoundry polygon;
SET rowCount=(SELECT COUNT(*) FROM tbl_kml_data);
SET currentRow = 1;
myUpdateLoop: WHILE (currentRow <= rowCount) DO
SET @boundryData = (SELECT boundry FROM tbl_kml_data WHERE tbl_id = currentRow);
SET updatedBoundry =ST_GeomFromText('POLYGON((6.546269854000059 80.15311213900003,6.54627481600005 80.15298415800004,6.54605968900006 80.15315188800008,6.546251038000038 80.15310380500006,6.546269854000059 80.15311213900003))');
/*SET @updatedBoundry = ST_GeomFromText( @boundryData);*/
UPDATE tbl_kml_data SET f_polygon = ST_GeomFromText(@boundryData) WHERE tbl_id = currentRow;
SET currentRow = currentRow + 1;
End WHILE myUpdateLoop;
END
知道如何解决这个问题
您真的需要存储过程来更新 table 吗?。一个简单的更新就可以完成这项工作:
UPDATE `tbl_kml_data`
SET `f_polygon` = `boundry`;
参见 dbfiddle。
如果你真的需要使用存储过程,你可以这样做:
DELIMITER //
DROP PROCEDURE IF EXISTS `new_procedure`//
CREATE PROCEDURE `new_procedure`()
BEGIN
DECLARE `rowCount`, `currentRow` BIGINT UNSIGNED;
DECLARE `boundryData` LONGTEXT;
DECLARE `updatedBoundry` POLYGON;
SET `rowCount` := (
SELECT COUNT(*)
FROM `tbl_kml_data`
);
SET `currentRow` := 1;
`myUpdateLoop`: WHILE (`currentRow` <= `rowCount`) DO
SET `boundryData` := (
SELECT ST_AsText(`boundry`)
FROM `tbl_kml_data`
WHERE `tbl_id` = `currentRow`
);
-- SET `updatedBoundry` := ST_GeomFromText('POLYGON((6.546269854000059 80.15311213900003,6.54627481600005 80.15298415800004,6.54605968900006 80.15315188800008,6.546251038000038 80.15310380500006,6.546269854000059 80.15311213900003))');
-- SET `updatedBoundry` := ST_GeomFromText(`boundryData`);
UPDATE `tbl_kml_data`
SET `f_polygon` = ST_GeomFromText(`boundryData`)
WHERE `tbl_id` = `currentRow`;
SET `currentRow` = `currentRow` + 1;
END WHILE `myUpdateLoop`;
END//
DELIMITER ;
参见 dbfiddle。
重要的是要指出 9.4 User-Defined Variables and routine variables 13.1.17 CREATE PROCEDURE and CREATE FUNCTION Syntax 之间的区别,是不同的变量 (@boundryData
!= boundryData
)。
我想使用存储过程更新 mysql table 列。该列的数据类型为多边形(空间数据)
SET boundryData = (SELECT boundry FROM tbl_data WHERE tbl_id = currentRow);
SET updatedBoundry = ST_GeomFromText(boundryData);
给出并错误说提供给函数的数据无效,如果我硬编码相同的数据集如下,存储过程按预期工作
SET updatedBoundry = ST_GeomFromText('POLYGON((6.546269854000059 80.15311213900003,6.54627481600005 80.15298415800004,6.546251038000038 80.15310380500006,6.546269854000059 80.15311213900003))');
整个存储过程如下
CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`()
BEGIN
DECLARE rowCount INT;
DECLARE boundryData longtext;
DECLARE currentRow INT;
DECLARE updatedBoundry polygon;
SET rowCount=(SELECT COUNT(*) FROM tbl_kml_data);
SET currentRow = 1;
myUpdateLoop: WHILE (currentRow <= rowCount) DO
SET @boundryData = (SELECT boundry FROM tbl_kml_data WHERE tbl_id = currentRow);
SET updatedBoundry =ST_GeomFromText('POLYGON((6.546269854000059 80.15311213900003,6.54627481600005 80.15298415800004,6.54605968900006 80.15315188800008,6.546251038000038 80.15310380500006,6.546269854000059 80.15311213900003))');
/*SET @updatedBoundry = ST_GeomFromText( @boundryData);*/
UPDATE tbl_kml_data SET f_polygon = ST_GeomFromText(@boundryData) WHERE tbl_id = currentRow;
SET currentRow = currentRow + 1;
End WHILE myUpdateLoop;
END
知道如何解决这个问题
您真的需要存储过程来更新 table 吗?。一个简单的更新就可以完成这项工作:
UPDATE `tbl_kml_data`
SET `f_polygon` = `boundry`;
参见 dbfiddle。
如果你真的需要使用存储过程,你可以这样做:
DELIMITER //
DROP PROCEDURE IF EXISTS `new_procedure`//
CREATE PROCEDURE `new_procedure`()
BEGIN
DECLARE `rowCount`, `currentRow` BIGINT UNSIGNED;
DECLARE `boundryData` LONGTEXT;
DECLARE `updatedBoundry` POLYGON;
SET `rowCount` := (
SELECT COUNT(*)
FROM `tbl_kml_data`
);
SET `currentRow` := 1;
`myUpdateLoop`: WHILE (`currentRow` <= `rowCount`) DO
SET `boundryData` := (
SELECT ST_AsText(`boundry`)
FROM `tbl_kml_data`
WHERE `tbl_id` = `currentRow`
);
-- SET `updatedBoundry` := ST_GeomFromText('POLYGON((6.546269854000059 80.15311213900003,6.54627481600005 80.15298415800004,6.54605968900006 80.15315188800008,6.546251038000038 80.15310380500006,6.546269854000059 80.15311213900003))');
-- SET `updatedBoundry` := ST_GeomFromText(`boundryData`);
UPDATE `tbl_kml_data`
SET `f_polygon` = ST_GeomFromText(`boundryData`)
WHERE `tbl_id` = `currentRow`;
SET `currentRow` = `currentRow` + 1;
END WHILE `myUpdateLoop`;
END//
DELIMITER ;
参见 dbfiddle。
重要的是要指出 9.4 User-Defined Variables and routine variables 13.1.17 CREATE PROCEDURE and CREATE FUNCTION Syntax 之间的区别,是不同的变量 (@boundryData
!= boundryData
)。