Невозможно вставить sdo_geometry с более чем 500 вершинами

У меня есть следующая таблица

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 - "слишком много аргументов для работы"

Я знаю, что невозможно вставить более 999 значений одновременно. Я пробовал решения для хранимых процедур, но я не эксперт по Oracle и, возможно, что-то упустил. Может ли кто-нибудь дать мне пример кода на С# или plsql (или на обоих) с хранимой процедурой или без нее, чтобы вставить эту строку?

Я использую Oracle 11g, OracleDotNetProvider v 12.1.400 на VS2015 И мой источник пространственных данных поступает из внешнего json (поэтому нет базы данных в базу данных), и я могу использовать только решения, использующие этот провайдер, без файлов данных или прямой базы данных умение обращаться. Я использую SQLDeveloper для проверки запросов.

Пожалуйста, не указывайте мне статьи, если вы не уверены, что работает с этой строкой/значением


person Miguel Pragier    schedule 14.04.2016    source источник
comment
В запросе более 500 вершин, и я не смог вставить сюда, потому что StackOverflow заблокирован.   -  person Miguel Pragier    schedule 15.04.2016


Ответы (2)


Наконец-то я нашел эффективное решение. Здесь: Построение большие объекты sdo_geometry в Sql Developer и SqlPlus. Pls-00306 Ошибка

person Miguel Pragier    schedule 15.04.2016
comment
не могли бы вы предоставить более подробную информацию? Я пытался использовать хранимую процедуру, а затем вызывать в plsql, но не повезло. все еще не работает на 500+ координатах - person Feng Zhang; 08.04.2020

Ограничение, которое вы видите, устарело. Он основан на идее, что никто никогда не напишет функцию, которая будет иметь более 1000 параметров (фактически 999 входных параметров и 1 возвращаемое значение).

Однако с появлением многозначных атрибутов (VARRAY) и объектов это уже не так. В частности, для пространственных типов атрибут SDO_ORDINATE на самом деле является типом объекта (реализованным как VARRAY), а ссылка на SDO_ORDINATE является конструктором этого типа объекта. Его ввод может быть массивом (если он используется в каком-либо языке программирования) или списком чисел, каждое из которых считается параметром функции — отсюда ограничение до 999 чисел).

Это происходит только в том случае, если вы жестко запрограммируете числа в своем операторе SQL. Но вообще это плохая практика. Лучше использовать переменные связывания, и типы объектов не являются исключением. Правильный способ - создать массив с координатами, которые вы хотите вставить, и передать их оператору вставки. Или создайте весь объект SDO_GEOMETRY как переменную связывания.

И, конечно же, сама идея построения сложной геометрии полностью вручную путем жесткого кодирования координат абсурдна. Эта фигура будет либо загружена из файла (и инструмент загрузки позаботится об этом), либо захвачена кем-то, рисующим фигуру на карте, а затем ваш инструмент ГИС/захвата передаст координаты вашему приложению для вставки в ваш база данных.

Другими словами, это ограничение до 999 атрибутов/чисел редко встречается в реальной жизни. Когда это происходит, это отражает непонимание того, как эти вещи работают.

person Albert Godfrind    schedule 15.04.2016