如何将包含lat/lng的数组保存到oracle存储过程中的sdo_geometry对象
how to save array which contains lat/lng to sdo_geometry object in oracle stored procedure
我在包内创建了存储过程。我想在 sdo_geometry 对象中存储一个由 lat/lng 组成的点数组。
首先在包内声明类型
TYPE p_int_type IS TABLE OF number;
然后定义过程定义。
PROCEDURE PRC_POLYGON_ADD_TESTING(
pPointArray IN p_int_type,
pCODE OUT VARCHAR2,
pDesc OUT VARCHAR2,
pMSG OUT VARCHAR2 );
这是我的程序正文
PROCEDURE PRC_POLYGON_ADD_TESTING
(
pPointArray IN p_int_type,
pCODE OUT VARCHAR2,
pDesc OUT VARCHAR2,
pMSG OUT VARCHAR2
)
AS
BEGIN
INSERT
INTO CIRCLE_LOCATION
(
polygon
)
VALUES
(
sdo_geometry ( 2003 -- 2D Polygon
, 4326 -- WGS84, the typical GPS coordinate system
, NULL -- sdo_point_type, should be NULL if sdo_ordinate_array specified
, sdo_elem_info_array( 1 -- First ordinate position within ordinate array
, 1003 -- Exterior polygon
, 1 -- All polygon points are specified in the ordinate array
) , sdo_ordinate_array(pPointArray))
);
END PRC_POLYGON_ADD_TESTING;
但我收到错误提示,此处不允许使用本地集合类型。
请指导我如何在 sdo_geometry 对象中保存由点 lat/lng 组成的完整数组。点是动态的,这就是我想使用数组的原因。
SDO_ORDINATE_ARRAY
和 P_INT_TYPE
不是相同的数据类型,您需要将值从一种类型转换为另一种类型。
创建包:
CREATE PACKAGE package_name IS
TYPE p_int_type IS TABLE OF number;
PROCEDURE PRC_POLYGON_ADD_TESTING(
pPointArray IN p_int_type,
pCODE OUT VARCHAR2,
pDesc OUT VARCHAR2,
pMSG OUT VARCHAR2
);
END;
/
然后是body,你需要把p_int_type
转换成SDO_ORDINATE_ARRAY
:
CREATE PACKAGE BODY package_name IS
PROCEDURE PRC_POLYGON_ADD_TESTING(
pPointArray IN p_int_type,
pCODE OUT VARCHAR2,
pDesc OUT VARCHAR2,
pMSG OUT VARCHAR2
)
AS
coords SDO_ORDINATE_ARRAY := SDO_ORDINATE_ARRAY();
BEGIN
coords.EXTEND( pPointArray.COUNT );
FOR i IN 1 .. pPointArray.COUNT LOOP
coords(i) := pPointArray(i);
END LOOP;
INSERT INTO CIRCLE_LOCATION
(
polygon
) VALUES (
sdo_geometry(
2003 -- 2D Polygon
, 4326 -- WGS84, the typical GPS coordinate system
, NULL -- sdo_point_type, should be NULL if sdo_ordinate_array specified
, sdo_elem_info_array(
1 -- First ordinate position within ordinate array
, 1003 -- Exterior polygon
, 1 -- All polygon points are specified in the ordinate array
)
, coords
)
);
END PRC_POLYGON_ADD_TESTING;
END;
/
然后你可以调用包来插入值:
DECLARE
pCODE VARCHAR2(20);
pDesc VARCHAR2(20);
pMsg VARCHAR2(20);
BEGIN
PACKAGE_NAME.PRC_POLYGON_ADD_TESTING(
PACKAGE_NAME.P_INT_TYPE( 0,0,0,10,10,10,10,0,0,0 ),
pCode,
pDesc,
pMsg
);
END;
/
db<>fiddle here
但是,您最好将该过程声明为采用 SDO_ORDINATE_ARRAY
而不是声明您自己的集合数据类型,这样您就不需要在类型之间进行转换。
我在包内创建了存储过程。我想在 sdo_geometry 对象中存储一个由 lat/lng 组成的点数组。
首先在包内声明类型
TYPE p_int_type IS TABLE OF number;
然后定义过程定义。
PROCEDURE PRC_POLYGON_ADD_TESTING(
pPointArray IN p_int_type,
pCODE OUT VARCHAR2,
pDesc OUT VARCHAR2,
pMSG OUT VARCHAR2 );
这是我的程序正文
PROCEDURE PRC_POLYGON_ADD_TESTING
(
pPointArray IN p_int_type,
pCODE OUT VARCHAR2,
pDesc OUT VARCHAR2,
pMSG OUT VARCHAR2
)
AS
BEGIN
INSERT
INTO CIRCLE_LOCATION
(
polygon
)
VALUES
(
sdo_geometry ( 2003 -- 2D Polygon
, 4326 -- WGS84, the typical GPS coordinate system
, NULL -- sdo_point_type, should be NULL if sdo_ordinate_array specified
, sdo_elem_info_array( 1 -- First ordinate position within ordinate array
, 1003 -- Exterior polygon
, 1 -- All polygon points are specified in the ordinate array
) , sdo_ordinate_array(pPointArray))
);
END PRC_POLYGON_ADD_TESTING;
但我收到错误提示,此处不允许使用本地集合类型。 请指导我如何在 sdo_geometry 对象中保存由点 lat/lng 组成的完整数组。点是动态的,这就是我想使用数组的原因。
SDO_ORDINATE_ARRAY
和 P_INT_TYPE
不是相同的数据类型,您需要将值从一种类型转换为另一种类型。
创建包:
CREATE PACKAGE package_name IS
TYPE p_int_type IS TABLE OF number;
PROCEDURE PRC_POLYGON_ADD_TESTING(
pPointArray IN p_int_type,
pCODE OUT VARCHAR2,
pDesc OUT VARCHAR2,
pMSG OUT VARCHAR2
);
END;
/
然后是body,你需要把p_int_type
转换成SDO_ORDINATE_ARRAY
:
CREATE PACKAGE BODY package_name IS
PROCEDURE PRC_POLYGON_ADD_TESTING(
pPointArray IN p_int_type,
pCODE OUT VARCHAR2,
pDesc OUT VARCHAR2,
pMSG OUT VARCHAR2
)
AS
coords SDO_ORDINATE_ARRAY := SDO_ORDINATE_ARRAY();
BEGIN
coords.EXTEND( pPointArray.COUNT );
FOR i IN 1 .. pPointArray.COUNT LOOP
coords(i) := pPointArray(i);
END LOOP;
INSERT INTO CIRCLE_LOCATION
(
polygon
) VALUES (
sdo_geometry(
2003 -- 2D Polygon
, 4326 -- WGS84, the typical GPS coordinate system
, NULL -- sdo_point_type, should be NULL if sdo_ordinate_array specified
, sdo_elem_info_array(
1 -- First ordinate position within ordinate array
, 1003 -- Exterior polygon
, 1 -- All polygon points are specified in the ordinate array
)
, coords
)
);
END PRC_POLYGON_ADD_TESTING;
END;
/
然后你可以调用包来插入值:
DECLARE
pCODE VARCHAR2(20);
pDesc VARCHAR2(20);
pMsg VARCHAR2(20);
BEGIN
PACKAGE_NAME.PRC_POLYGON_ADD_TESTING(
PACKAGE_NAME.P_INT_TYPE( 0,0,0,10,10,10,10,0,0,0 ),
pCode,
pDesc,
pMsg
);
END;
/
db<>fiddle here
但是,您最好将该过程声明为采用 SDO_ORDINATE_ARRAY
而不是声明您自己的集合数据类型,这样您就不需要在类型之间进行转换。