错误:列索引超出范围:1,列数:0

时间:2014-12-15 09:25:30

标签: postgresql wso2dss

我正在使用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中执行,然后它也在工作。如果那么为什么它不接受动态参数?请让我知道..

1 个答案:

答案 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;