Mysql存储过程-空间功能

时间:2019-09-20 18:11:45

标签: mysql stored-procedures gis spatial

我想使用存储过程更新mysql表列。列的数据类型为多边形(空间数据)

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

有关如何解决此问题的任何想法

1 个答案:

答案 0 :(得分:1)

您真的需要一个存储过程来更新表吗?一个简单的更新就可以完成这项工作:

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与常规变量13.1.17 CREATE PROCEDURE and CREATE FUNCTION Syntax之间的区别,它们是不同的变量(@boundryData!= boundryData)。