2016-04-14 37 views
0

Ich habe die folgende TabelleKann nicht einfügen SDO_GEOMETRY mit mehr als 500 Eckpunkten

CREATE TABLE MYTABLE (MYID VARCHAR2(5), MYGEOM MDSYS.SDO_GEOMETRY);

und die SQL-Anweisung unter:

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)));

Auch nach mehreren Artikeln über mögliche Lösungen zu lesen, ich konnte nicht herausfinden, wie dieses sdo_geometry-Objekt eingefügt wird. Die Oracle klagt mit dieser Nachricht: ORA-00939 - „zu viele Argumente für funcion“

Ich weiß, dass es nicht möglich ist, mehr als 999 Werte auf einmal einzufügen. Ich habe Stored Procedure-Lösungen versucht, aber ich bin kein Oracle-Experte, und vielleicht habe ich etwas verpasst. Könnte mir jemand ein Beispiel für Code in C# oder plsql (oder beides) mit oder ohne gespeicherte Prozedur geben, um diese Zeile einzufügen?

Ich verwende Oracle 11g, OracleDotNetProvider v 12.1.400 auf VS2015 UND meine Quelle von Geodaten stammt von einem externen JSON (also, keine Datenbank-zu-Datenbank) und ich kann nur Lösungen mit diesem Anbieter verwenden, ohne Datendateien oder direkte Datenbankbehandlung. Ich verwende SQLDeveloper, um die Abfragen zu testen.

Bitte, zeigen Sie mir nicht Artikel, wenn Sie sich nicht sicher sind, dass ich mit dieser Zeile/Wert

+0

Die Abfrage hat mehr als 500 Vertices, und ich konnte hier nicht einfügen, da StackOverflow blockiert. – MiguelPragier

Antwort

0

Die Einschränkung, die Sie sehen, ist alt. Es basiert auf der Idee, dass niemand jemals eine Funktion schreiben würde, die mehr als 1000 Parameter hätte (eigentlich 999 Eingabeparameter und 1 Rückgabewert).

Mit der Einführung von mehrwertigen Attributen (VARRAYs) und Objekten ist dies jedoch nicht mehr zutreffend. Insbesondere für räumliche Typen ist das SDO_ORDINATE-Attribut wirklich ein Objekttyp (implementiert als VARRAY) und der Verweis auf SDO_ORDINATE ist der Konstruktor dieses Objekttyps. Seine Eingabe kann ein Array sein (wenn es in einer Programmiersprache verwendet wird) oder eine Liste von Zahlen, von denen jede als ein Parameter für eine Funktion betrachtet wird - daher die Grenze für 999 Zahlen.

Das passiert nur, wenn Sie die Zahlen in Ihrer SQL-Anweisung fest codieren. Aber das ist generell eine schlechte Übung. Die bessere Praxis besteht darin, Bind-Variablen zu verwenden, und Objekttypen sind keine Ausnahme. Die richtige Methode besteht darin, ein Array mit den Koordinaten zu erstellen, die Sie einfügen möchten, und diese an die insert-Anweisung zu übergeben. Oder konstruieren Sie das gesamte SDO_GEOMETRY-Objekt als Bind-Variable.

Und natürlich ist die Idee, eine komplexe Geometrie vollständig manuell durch Festcodieren der Koordinaten zu konstruieren, absurd. Diese Form wird entweder aus einer Datei geladen (und ein Ladewerkzeug wird sich darum kümmern) oder von jemandem aufgenommen, der eine Form über eine Karte zeichnet - und dann übergibt Ihr GIS/Capture Tool die Koordinaten an Ihre Anwendung zum Einfügen in Ihre Datenbank.

Mit anderen Worten, diese Beschränkung auf 999 Attribute/Zahlen wird selten im wirklichen Leben gesehen. Wenn dies der Fall ist, spiegelt dies Missverständnisse darüber wider, wie diese Dinge funktionieren.