2014-12-15 12 views
7

sto usando wso2dss 3.0.0.I'm tentativo di eseguire un esempio di query PostgreSQLERRORE: L'indice di colonna è fuori portata: 1, numero di colonne: 0

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

Si sta lavorando bene in PostgreSQL.When sto usando stessa query in wso2dss cioè

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

per me motivo di errore del tipo:

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. 

se rimuovo 01.239.549,745 mila(virgolette) di cerchio quindi non verrà eseguito. query '' simile a questa: (??? (,),)

SELEZIONA AddressId, geocoding DA maddress DOVE geocode :: punto < @ circolo;

ti do seguente errore:

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 

Ma cerchio è insito funzione geografica di PostgreSQL, allora è necessario scrivere funzione esplicita? altrimenti dov'è l'errore esatto? Anche se inserisco la query con il parametro di input mentre eseguo in PostgreSQL, funziona anche. Se è così, perché non accetta i parametri dinamici? Per favore fatemi sapere ..

+0

non so wso2dss ma il problema sembra essere come i parametri si innestano nella stringa che definisce il cerchio . La seconda opzione senza le virgolette è semplicemente sbagliata perché ora PostgreSQL tratta 'circle (...)' come una funzione per la quale non esiste uno schema adeguato. Scopri come i parametri vengono inseriti nella query da wso2dss. – Patrick

+0

yup..e wso2dss non è in grado di accettare il funation..questo è il problema – user3129056

risposta

6

Geometric types possono essere inseriti in più modi.

  • Nella prima forma, i parametri ? non vengono sostituiti con i valori, perché sono parti letterali di una stringa. Così sono attesi 0 parametri ...

  • Nella seconda forma senza virgolette singole, i parametri ? vengono sostituiti, ma ((18.9750,72.8258), 5) è interpretato per essere un tipo di riga, che non funziona con circle().

si sta cercando di richiamare la funzione circle() che prende un point e un double precision ("centro e raggio al cerchio"). Queste sono le varianti di sintassi validi:

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.
Il cast di ::text è solo per disinfettare il display squilibrato in SQL violino

Nel tuo caso, per fornire valori numerici (non una stringa letterale), utilizzare l'ultimo modulo e dovrebbe funzionare:

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

Se ws o2dss (che non ho alcuna esperienza con) non accetta funzioni, è necessario utilizzare una delle prime due forme e di fornire un unico parametro come stringa letterale:

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

...dove il parametro è il letterale concatenato come mostrato sopra.

È potrebbe lasciare Postgres fare la concatenazione e ancora passare tre valori numerici:

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

Grazie a @Erwin Brandstetter..it funziona – user3129056

+0

@ user3129056: Cool. Quale delle varianti fa il lavoro per te? –

+1

SELECT addressid, geocode FROM maddress WHERE geocode :: point <@ circle (point (?,?),?); per me va bene – user3129056

Problemi correlati