我正在使用wso2dss 3.0.0。我正在尝试执行postgresql查询,即
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle '((18.9750,72.8258), 5)';
它在PostgreSQL中工作正常。当我在wso2dss中使用相同的查询时,即
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle '((?,?), ?)';
它给我一个错误:
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.
如果我删除圈子的" ' "
(引号),那么它也将无法执行。查询''看起来像这样:
SELECT addressid,geocode 来自maddress 在哪里geocode :: point&lt; @ circle((?,?),?);
它会给出以下错误:
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
但是圈子是PostgreSQL的内置地理功能那么是否有必要编写显式函数?否则确切错误在哪里?即使我把输入参数的查询作为我在PostgreSQL中执行,然后它也在工作。如果那么为什么它不接受动态参数?请让我知道..
答案 0 :(得分:6)
Geometric types可以多种方式输入。
在第一种形式中,您的?
参数不会替换为值,因为它们是字符串的文字部分。所以预计会有0个参数......
在没有单引号的第二种形式中,您的?
参数会被替换,但((18.9750,72.8258), 5)
会被解释为行类型,但不适用于circle()
。
您正在尝试调用circle()
和point
(“中心和半径为圆圈”)的函数double precision
。这些是有效的语法变体:
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.
转换为::text
只是为了清理SQL小提琴中的混乱显示
在您的情况下,要提供数值(不是字符串文字),请使用最后一个表单,它应该有效:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle(point(?,?), ?);
如果wso2dss(我没有经验)不接受函数,则必须使用前两个表单中的一个并提供 单个 参数作为字符串文字:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle ?;
...其中参数是上面显示的连接文字。
你可以让Postgres进行连接并仍传递三个数值:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ ('(('::text || ? || ',' || ? || '),' || ? || ')')::circle;