无法插入超过 500 个顶点的 sdo_geometry

Cannot insert sdo_geometry with more than 500 vertices

我有以下table

CREATE TABLE MYTABLE (MYID VARCHAR2(5), MYGEOM MDSYS.SDO_GEOMETRY );

和下面的 sql 语句:

INSERT INTO MYTABLE (MYID,MYGEOM) VALUES ( 255, SDO_GEOMETRY(2003, 2554, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1), SDO_ORDINATE_ARRAY(-34.921816571,-8.00119170599993, ...,-34.921816571,-8.00119170599993)));

即使阅读了几篇有关可能解决方案的文章,我也找不到如何插入此 sdo_geometry 对象。 Oracle 抱怨此消息: ORA-00939 - "too many arguments for funcion"

我知道不能一次插入超过 999 个值。 我尝试了存储过程解决方案,但我不是 Oracle 专家,也许我错过了一些东西。 有人可以给我一个使用或不使用存储过程的 c# 或 plsql(或两者)代码示例来插入该行吗?

我在 VS2015 上使用 Oracle 11g、OracleDotNetProvider v 12.1.400,我的空间数据源来自外部 json(因此,没有数据库到数据库),我只能使用解决方案使用此提供程序,无需数据文件或直接数据库处理。 我正在使用 SQLDeveloper 来测试查询。

如果您不确定是否适用于此,请不要指出我的文章row/value

我终于找到了有效的解决办法。这里:Constructing large sdo_geometry objects in Sql Developer and SqlPlus. Pls-00306 Error

您看到的限制是旧的。它基于这样的想法,即没有人会编写一个具有超过 1000 个参数(实际上是 999 个输入参数和 1 个 return 值)的函数。

但是随着多值属性 (VARRAY) 和对象的出现,这不再是事实。特别是对于空间类型,SDO_ORDINATE 属性实际上是一个对象类型(作为 VARRAY 实现)并且对 SDO_ORDINATE 的引用是该对象类型的构造函数。它的输入可以是数组(如果在某些编程语言中使用)或数字列表,每个数字都被视为函数的参数 - 因此限制为 999 个数字。

只有在 SQL 语句中对数字进行硬编码时才会发生这种情况。但这通常是一种不好的做法。更好的做法是使用绑定变量,对象类型也不例外。正确的方法是用要插入的坐标构造一个数组,并将它们传递给插入语句。或者将整个 SDO_GEOMETRY 对象构造为绑定变量。

当然,通过对坐标进行硬编码来完全手动构建复杂几何体的想法是荒谬的。该形状将从文件中加载(并且加载工具会负责),或者由在地图上绘制形状的人捕获 - 然后您的 GIS/capture 工具会将坐标传递给您的应用程序以供插入进入你的数据库。

换句话说,999个属性/数字的限制在现实生活中很少见。当它出现时,它反映了对这些事情如何运作的误解。