我有下表
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对象。 甲骨文抱怨这条消息: ORA-00939 - "太多关于功能的论据"
我知道一次插入超过999个值是不可能的。 我尝试过存储过程解决方案,但我不是Oracle专家,也许我错过了一些东西。 有人可以给我一个c#或plsql(或两者)中有或没有存储过程的代码示例来插入那行吗?
我在VS2015上使用Oracle 11g,OracleDotNetProvider v 12.1.400而我的空间数据源来自外部json(因此,没有数据库到数据库),我只能使用此提供程序的解决方案,没有数据文件或直接数据库处理。 我使用SQLDeveloper来测试查询。
如果您不确定是否适用于此行/值,请不要指出我的文章
答案 0 :(得分:1)
我终于找到了有效的解决方案。这里:Constructing large sdo_geometry objects in Sql Developer and SqlPlus. Pls-00306 Error
答案 1 :(得分:0)
您看到的限制是旧的。它基于这样的想法:没有人会编写一个具有超过1000个参数的函数(实际上是999个输入参数和1个返回值)。
然而,随着多值属性(VARRAYs)和对象的出现,这已不再适用。特别是对于空间类型,SDO_ORDINATE属性实际上是一个对象类型(实现为VARRAY),对SDO_ORDINATE的引用是该对象类型的构造函数。它的输入可以是一个数组(如果在某种编程语言中使用)或数字列表,每个数字都被视为函数的参数 - 因此限制为999个数字。
只有在SQL语句中对数字进行硬编码时才会发生这种情况。但这通常是一种不好的做法。更好的做法是使用绑定变量,对象类型也不例外。正确的方法是使用您要插入的坐标构造一个数组,并将它们传递给insert语句。或者将整个SDO_GEOMETRY对象构造为绑定变量。
当然,通过硬编码坐标完全手动构建复杂几何体的想法是荒谬的。该形状将从文件加载(加载工具将处理该文件),或由在地图上绘制形状的人捕获 - 然后您的GIS /捕获工具将坐标传递给您的应用程序以插入您的数据库中。
换句话说,在现实生活中很少看到对999属性/数字的限制。当它发生时,它反映了对这些事情如何运作的误解。