2016-04-14 29 views
0

插入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對象。 甲骨文抱怨此消息: ORA-00939 - 「太多的論據funcion」

我知道,這是不可能的,在一次插入多則999個值。 我試過存儲過程解決方案,但我不是Oracle專家,也許我錯過了一些東西。 有人可以給我一個在c#或plsql(或兩者)有或沒有存儲過程的代碼示例,以插入該行嗎?

我在VS2015上使用Oracle 11g,OracleDotNetProvider v 12.1.400,我的空間數據源來自外部json(所以沒有數據庫到數據庫),我只能使用此提供程序的解決方案,而沒有數據文件或直接數據庫處理。 我正在使用SQLDeveloper來測試查詢。

請,請不要把我的文章,如果您不能確定與該行/值

+0

查詢有500多個頂點,我無法粘貼到這裏,因爲StackOverflow被阻塞。 – MiguelPragier

回答

0

你看到的限制是陳舊的。它基於這樣的想法,即沒有人會寫出一個具有1000個以上參數的函數(實際上是999個輸入參數和1個返回值)。

但是隨着多值屬性(VARRAYs)和對象的出現,這不再是事實。特別是對於空間類型,SDO_ORDINATE屬性實際上是一個對象類型(實現爲VARRAY),對SDO_ORDINATE的引用是該對象類型的構造函數。它的輸入可以是一個數組(如果使用某種編程語言)或數字列表,每個數據被視爲一個函數的參數 - 因此限制爲999個數字)。

只有在硬編碼SQL語句中的數字時纔會發生這種情況。但這通常是一種不好的做法。更好的做法是使用綁定變量,而對象類型也不例外。正確的方法是用你想要插入的座標構造一個數組,並將它們傳遞給insert語句。或者將整個SDO_GEOMETRY對象構造爲一個綁定變量。

當然,通過對座標硬編碼來完全手動構建複雜幾何的想法是荒謬的。該形狀將從文件加載(並且加載工具將處理該內容),或者通過某人在地圖上繪製形狀來捕獲 - 然後您的GIS /捕獲工具會將座標傳遞給您的應用程序以插入到您的應用程序中數據庫。

換句話說,對999個屬性/數字的限制在現實生活中很少見到。當它發生時,它反映了對這些事情如何工作的誤解。