Mysql Хранимая Процедура - Пространственные функции - PullRequest
0 голосов
/ 20 сентября 2019

Я хотел обновить столбец таблицы 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 Ответ

1 голос
/ 21 сентября 2019

Вам действительно нужна хранимая процедура для обновления таблицы?Простое обновление может сделать эту работу:

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 Определяемыми пользователем переменными и стандартными переменными 13.1.17 CREATEСинтаксис , PROCEDURE и CREATE FUNCTION, это разные переменные (@boundryData! = boundryData).

...