отсутствует правая скобка при вставке записи в полигон столбца типа данных sdo_geomety

Я создал таблицу в оракуле 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 Error: ORA-00907: missing right parenthesis
1. 00000 -  "missing right parenthesis"**

В основном у меня есть четыре координаты фермы, и я вставляю их в этот столбец, используя следующий 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
                      )
                    )
                    );

person Ravi    schedule 12.11.2013    source источник


Ответы (2)


Что такое 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.

person Przemyslaw Kruglej    schedule 12.11.2013

Как и в предыдущем ответе, я также не понимаю значения «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 представляют угол в ожидаемой последовательности (т.е. против часовой стрелки). Если это не так, просто измените порядок координат.

И наконец, как уже было сказано: НИКОГДА, НИКОГДА, НИКОГДА не создавайте объекты (таблицы) ни в какой схеме системы!!! Это верная гарантия будущих неприятностей. Создавайте свои таблицы в своих собственных схемах.

person Albert Godfrind    schedule 13.11.2013