错误:列索引超出范围:1,列数:0 [英] ERROR : The column index is out of range: 1, number of columns: 0

查看:977
本文介绍了错误:列索引超出范围:1,列数:0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用wso2dss 3.0.0。我正在尝试执行一个PostgreSQL查询,即

I'm using wso2dss 3.0.0.I'm trying to execute a postgresql query i.e.

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

在PostgreSQL中工作正常。当我在wso2dss中使用相同查询时,即

It is working fine in PostgreSQL.When i'm using same query in wso2dss i.e.

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.

如果我删除圆的' 引号),那么它也将不会执行。查询''看起来像这样:

if i remove " ' "(quotation mark) of circle then also it will not execute. query '' look like this :

选择地址ID,地理编码
FROM maddress
WHERE geocode :: point< @ circle((?,? ),?);

SELECT addressid, geocode FROM maddress WHERE geocode::point <@ 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中执行查询时使用输入参数查询,它也可以正常工作。如果可以,为什么它不接受动态参数?请让我知道。.

But circle is inbuilt geographical function of PostgreSQL then is it necessary to write explicit function? else where is the exact error? Even if i put the query with input parameter as i execute in PostgreSQL then also it's working.If so then why it is not accepting dynamic parameters? Please let me know..

推荐答案

几何类型可以通过多种方式输入。

Geometric types can be input in multiple ways.


  • 在第一种形式中,您的参数不会替换为值,因为它们是字符串的文字部分。因此,预期会有0个参数...

  • In the first form, your ? parameters are not replaced with values because they are literal parts of a string. So 0 parameters are expected ...

在不带单引号的第二种形式中,您的参数被替换,但(((18.9750,72.8258),5)被解释为行类型,​​不适用于 circle()

In the second form without single quotes, your ? parameters are replaced, but ((18.9750,72.8258), 5) is interpreted to be a row type, which doesn't work with circle().

您正在尝试调用函数 circle() 需要一个和一个双精度(圆心和半径) 。这些是有效的语法变体:

You are trying to invoke the function circle() that takes a point and a double precision ("center and radius to circle"). These are valid syntax variants:

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提琴。

强制转换为 :: text 只是为了清理SQL提琴中乱码的显示内容

SQL fiddle.
The cast to ::text is just to sanitize the deranged display in SQL fiddle

在您的情况下,要提供数值(不是字符串文字),请使用最后一种形式,它应该可以正常工作:

In your case, to provide numeric values (not a string literal), use the last form and it should work:

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

如果wso2dss(我没有经验)不接受功能,则必须使用以下一种前两种形式,并提供 参数作为字符串文字:

If wso2dss (which I have no experience with) does not accept functions, you have to use one of the first two forms and provide a single parameter as string literal:

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

...其中参数是如上所示的连接文字。

... where the parameter is the concatenated literal as displayed above.

可以让Postgres进行连接并仍然传递三个数值:

You could let Postgres do the concatenation and still pass three numeric values:

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

这篇关于错误:列索引超出范围:1,列数:0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆