0

我在 oracle 11g 中创建了一个表

  CREATE TABLE "SYSTEM"."CN_PLOT_OVERLAP" 
   (    "ID" NUMBER(6,0), 
    "UNIT_CODE" VARCHAR2(2 BYTE), 
    "SEASON_CNTRL" NUMBER(2,0), 
    "RYOT_CODEE" VARCHAR2(9 BYTE), 
    "SHARE_OR_PERC_VAL" NUMBER(1,2), 
    "PLOT_NO" VARCHAR2(15 BYTE), 
    "TOTAL_AREA" BINARY_FLOAT, 
    "LAT1" BINARY_FLOAT, 
    "LNG1" BINARY_FLOAT, 
    "LAT2" BINARY_FLOAT, 
    "LNG2" BINARY_FLOAT, 
    "LAT3" BINARY_FLOAT, 
    "LNG3" BINARY_FLOAT, 
    "LAT4" BINARY_FLOAT, 
    "LNG4" BINARY_FLOAT, 
    "POLYGON" "SDO_GEOMETRY", 
     CONSTRAINT "ID_PK" PRIMARY KEY ("ID")

并且已经插入了期望多边形的值。现在,当我为Polygon插入值时,它显示错误

**SQL 错误:ORA-00907:缺少右括号
1. 00000 - “缺少右括号”**

基本上我有一个农场的四个坐标,并使用以下 sql 将其插入此列

update cn_plot_overlap set polygon = (1,
  MDSYS.sdo_geometry(
  2003,
  4326,
  NULL,
  sdo_elem_info_array(1,1003,1),
  sdo_ordinate_array(27.79094,80.5275449,   
                      27.7912333,80.527696, 
                      27.79085,80.5285083,
                      27.790571,80.5283216,
                      27.79094,80.5275449
                      )
                    )
                    );
4

2 回答 2

1

1的第一行是UPDATE什么?它不应该在那里。这就是你应该如何创建SDO_GEOMETRY对象:

update cn_plot_overlap set polygon = 
  MDSYS.sdo_geometry(
  2003,
  4326,
  NULL,
  sdo_elem_info_array(1,1003,1),
  sdo_ordinate_array(27.79094,80.5275449,   
                      27.7912333,80.527696, 
                      27.79085,80.5285083,
                      27.790571,80.5283216,
                      27.79094,80.5275449
                      )
                    );

我也不建议在SYS用户的模式中创建任何对象。

于 2013-11-12T17:10:02.257 回答
0

和之前的回答一样,我也不明白你更新中“1”的含义。除非您以某种方式期望它是您要为其填充 POLYGON 列的对象的标识符。如果是这样,那么您需要编写如下所示的更新。

请注意,您的坐标也有问题:Oracle(就像几乎所有其他人一样)希望以(X,Y)顺序提供坐标,即(经度,纬度)。如前所述,您的农场位于北冰洋某处!如果您正确编写坐标,它将正确位于印度:

update cn_plot_overlap set polygon = 
  sdo_geometry(
    2003,
    4326,
    NULL,
    sdo_elem_info_array(1,1003,1),
    sdo_ordinate_array(
      80.5275449,27.79094,   
      80.527696,27.7912333, 
      80.5285083,27.79085,
      80.5283216,27.790571,
      80.5275449,27.79094
    )
  )
where id = 1;

如果要使用 LATn、LNGn 列中可用的值更新表中所有行的多边形列,请使用以下语法:

update cn_plot_overlap set polygon = 
  sdo_geometry(
    2003,
    4326,
    NULL,
    sdo_elem_info_array(1,1003,1),
    sdo_ordinate_array(
      lng1,lat1,
      lng2,lat2,
      lng3,lat3,
      lng4,lat4,
      lng1,lat1
    )
  );

这假设 LATn,LNGn 列表示预期序列中的角(即逆时针)。如果不是这种情况,只需颠倒坐标顺序即可。

最后,正如已经提到的:永远,永远,永远不要在任何系统模式中创建对象(表)!!!这是未来麻烦的可靠保证。在您自己的模式中创建您的表。

于 2013-11-13T23:55:34.167 回答