2014-12-15 20 views
7

Tôi đang sử dụng wso2dss 3.0.0.I'm cố gắng để thực hiện một ví dụ truy vấn postgresqlLỖI: Chỉ số cột là ra khỏi phạm vi: 1, số cột: 0

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

Nó đang làm việc tốt trong PostgreSQL.When tôi đang sử dụng cùng một truy vấn trong wso2dss tức

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

Nó mang lại cho tôi lỗi như:

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. 

nếu tôi loại bỏ " ' " (dấu ngoặc kép) của vòng tròn sau đó cũng sẽ không thực thi. truy vấn '' trông như thế này: (?? (,),)

CHỌN AddressID, mã địa lý TỪ maddress ĐÂU geocode :: điểm < @ vòng tròn;

nó sẽ cung cấp cho báo lỗi sau:

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 

Nhưng vòng tròn được chức năng địa lý sẵn có của PostgreSQL sau đó là nó cần thiết để viết chức năng rõ ràng? khác đâu là lỗi chính xác? Ngay cả khi tôi đặt truy vấn với tham số đầu vào như tôi thực hiện trong PostgreSQL thì nó cũng hoạt động. Nếu vậy thì tại sao nó không chấp nhận các tham số động? Vui lòng cho tôi biết ..

+0

Tôi không biết wso2dss nhưng vấn đề dường như là cách các tham số được ghép vào chuỗi định nghĩa đường tròn . Tùy chọn thứ hai không có dấu ngoặc kép là sai bởi vì bây giờ PostgreSQL xử lý 'vòng tròn (...)' như một hàm mà không có mẫu thích hợp. Kiểm tra cách các tham số được đưa vào truy vấn từ wso2dss. – Patrick

+0

yup..và wso2dss không thể chấp nhận lời chào ... đó là vấn đề – user3129056

Trả lời

6

Geometric types có thể được nhập bằng nhiều cách.

  • Ở dạng đầu tiên, thông số ? của bạn không được thay thế bằng giá trị vì chúng là các phần chữ của chuỗi. Vì vậy, 0 tham số được dự kiến ​​...

  • Trong hình thức thứ hai mà không có dấu ngoặc kép duy nhất, ? thông số của bạn được thay thế, nhưng ((18.9750,72.8258), 5) được hiểu là một loại hàng, mà không làm việc với circle().

Bạn đang cố gắng để gọi hàm circle() mà phải mất một pointdouble precision ("trung tâm và bán kính vòng tròn"). Đây là những biến thể cú pháp hợp lệ:

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.
Dàn diễn viên để ::text chỉ là để khử trùng màn hình hiển thị loạn trí trong SQL fiddle

Trong trường hợp của bạn, để cung cấp giá trị số (không phải là một chuỗi theo nghĩa đen), sử dụng biểu mẫu cuối cùng và nó sẽ hoạt động:

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

Nếu ws o2dss (mà tôi không có kinh nghiệm với) không chấp nhận chức năng, bạn phải sử dụng một trong hai hình thức đầu tiên và cung cấp một đơn tham số như chuỗi chữ:

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

...trong đó tham số là chữ được ghép nối như được hiển thị ở trên.

Bạn thể hãy Postgres làm nối và vẫn vượt qua ba giá trị số:

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

Cảm ơn @Erwin Brandstetter..it đang hoạt động – user3129056

+0

@ user3129056: Tuyệt. Biến thể nào làm công việc cho bạn? –

+1

SELECT addressid, mã địa lý FROM maddress WHERE geocode :: point <@ circle (point (?,?),?); làm việc cho tôi – user3129056

Các vấn đề liên quan