2014-12-15 41 views
7

ich wso2dss 3.0.0.I'm bin mit versuchen, eine PostgreSQL-Abfrage dhERROR: Der Spaltenindex ist außerhalb des zulässigen Bereichs: 1, Anzahl der Spalten: 0

SELECT addressid, geocode 
FROM maddress 
WHERE geocode::point <@ circle '((18.9750,72.8258), 5)'; 

Es funktioniert gut auszuführen in PostgreSQL.When i gleiche Abfrage in wso2dss also bin mit

SELECT addressid, geocode 
FROM maddress 
WHERE geocode::point <@ circle '((?,?), ?)';  

Es gibt mir Fehler wie:

DS Fault Message: Error in 'SQLQuery.processNormalQuery' 
DS Code: DATABASE_ERROR 
Source Data Service:- 
Name: Geofence_DataService 
Location: /Geofence_DataService.dbs 
Description: N/A 
Default Namespace: http://ws.wso2.org/dataservice 
Current Request Name: adding_geofence_op 
Current Params: {longitude=72.8258, radius=4, latitude=18.9750} 
Nested Exception:- 
DS Fault Message: Error in 'createProcessedPreparedStatement' 
DS Code: UNKNOWN_ERROR 
Nested Exception:- 
org.postgresql.util.PSQLException: The column index is out of range: 1, number of columns: 0. 

wenn ich entfernen " ' " (Anführungszeichen) des Kreises dann wird es auch nicht ausgeführt. Abfrage '' wie folgt aussehen: (? (,),)

SELECT AddressID, geocodieren VON maddress WHERE geocode :: Punkt < @ Kreis;

wird es folgende Fehler geben:

Caused by: javax.xml.stream.XMLStreamException: DS Fault Message: Error in 'SQLQuery.processNormalQuery' 
DS Code: DATABASE_ERROR 
Source Data Service:- 
Name: Geofence_DataService 
Location: /Geofence_DataService.dbs 
Description: N/A 
Default Namespace: http://ws.wso2.org/dataservice 
Current Request Name: geofence_op 
Current Params: {longitude=72.8258, radius=4, latitude=18.9750} 
Nested Exception:- 
org.postgresql.util.PSQLException: ERROR: function circle(record, double precision) does not exist 
    Hint: No function matches the given name and argument types. You might need to add explicit type cast 

Aber Kreis integrierte geografische Funktion von PostgreSQL ist es dann notwendig, explizite Funktion zu schreiben? sonst wo ist der genaue Fehler? Selbst wenn ich die Abfrage mit dem Input-Parameter setze, wie ich es in PostgreSQL ausführe, dann funktioniert es auch. Wenn ja, warum akzeptiert es keine dynamischen Parameter? Bitte lassen Sie mich wissen.

+0

Ich weiß nicht, wso2dss aber das Problem scheint zu sein, wie die Parameter in den String gespleißt werden, die den Kreis definiert . Die zweite Option ohne die Anführungszeichen ist einfach falsch, weil PostgreSQL nun "circle (...)" als eine Funktion behandelt, für die es kein passendes Muster gibt. Überprüfen Sie, wie die Parameter in die Abfrage von wso2dss eingegeben werden. – Patrick

+0

yup..und wso2dss ist nicht in der Lage, Spaß zu akzeptieren..das ist das Problem – user3129056

Antwort

6

Geometric types kann auf verschiedene Arten eingegeben werden.

  • In der ersten Form, Ihre ? Parameter nicht mit Werten ersetzt, weil sie wörtliche Teile eines Strings sind. So 0 Parameter erwartet ...

  • In der zweiten Form ohne einfache Anführungszeichen, Ihre ? Parameter ersetzt werden, aber ((18.9750,72.8258), 5) interpretiert wird ein Zeilentyp zu sein, die nicht mit circle() funktionieren.

Sie versuchen die Funktion circle() aufzurufen, die eine point und double precision („Mittelpunkt und Radius umrunden“) führt. Diese gelten Syntaxvarianten:

SELECT circle '((18.9750,72.8258), 5)'  AS cast_literal 
    ' <(18.9750,72.82580),5>'::circle  AS cast_literal2 
    , circle(point '(18.9750,72.8258)', '5') AS literal_point_n_radius 
    , circle(point(18.9750,72.8258), '5') AS point_n_literal_radius 
    , circle(point(18.9750,72.8258), 5)  AS point_n_radius 

SQL fiddle.
Die Besetzung zu ::text nur ist die verwirrte Anzeige in SQL Geige

In Ihrem Fall zu sanieren, numerische Werte liefern (nicht eine Zeichenfolge Literal), verwenden Sie das letzte Formular und es sollte funktionieren:

SELECT addressid, geocode 
FROM maddress 
WHERE geocode::point <@ circle(point(?,?), ?); 

Wenn ws o2dss (die ich mit keine Erfahrung haben) hat Funktionen, die nicht akzeptieren, haben Sie eine der ersten beiden Formen zu verwenden und eine Einzel Parameter als String liefern wörtliche:

SELECT addressid, geocode 
FROM maddress 
WHERE geocode::point <@ circle ?; 

...Dabei ist der Parameter das verkettete Literal, wie oben angezeigt.

Sie könnte lassen Postgres die Verkettung tun und gibt noch drei numerische Werte:

SELECT addressid, geocode 
FROM maddress 
WHERE geocode::point <@ ('(('::text || ? || ',' || ? || '),' || ? || ')')::circle; 
+0

Danke @Erwin Brandstetter..it funktioniert – user3129056

+0

@ user3129056: Cool. Welche der Varianten macht die Arbeit für Sie? –

+1

SELECT addressid, geocode FROM maddress WHERE Geocode :: Punkt <@ Kreis (Punkt (?,?),?); funktioniert bei mir – user3129056

Verwandte Themen