【发布时间】:2020-10-28 21:39:27
【问题描述】:
我需要基于纬度和经度对执行基于位置的搜索,以找出给定 KM 的半径/距离内商店的附近位置。
- 我将(肯定)使用 Oracle 的 SDO_GEOMETRY 来搜索位置。
- 此外,表结构是基于父子表的,这样存储地址(zip、lat/long)在父表中,而存储详细信息(姓名、联系人等)在子表中。
- 这是为了确保我们没有多余的数据(因为多个商店可以有相同的纬度/经度,并且通过一些暗魔法相同的地址)
我有以下情况(提供表格):
版本 - Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
- 表:STORE_LOCATION
CREATE TABLE STORE_LOCATE
(
ID NUMBER DEFAULT STORE_LOCATE.nextval,
POSTAL_CODE VARCHAR2(18) NOT NULL,
ADDRESS VARCHAR2(382) NOT NULL,
GEO_LOCATION SDO_GEOMETRY NOT NULL
);
- 表:STORE_DETAIL
CREATE TABLE STORE_DETAIL
(
ID NUMBER DEFAULT STORE_DETAIL_SEQ.nextval,
STORE_CODE VARCHAR2(20) NOT NULL,
STORE_NAME VARCHAR2(150) NOT NULL,
IS_ACTIVE NUMBER(3) DEFAULT 0 NOT NULL,
fk_store_locate_id INT NOT NULL. -- FK to ID of parent
);
我已在父项中插入数据:
INSERT INTO STORE_LOCATE (ZIP, ADDRESS, GEO_LOCATION) VALUES
('567875', '84 Paddar Road',
SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE (80.34234431,26.12354422, NULL), NULL, NULL));
同样,子表也有条目:
INSERT INTO STORE_DETAIL (STORE_CODE, STORE_NAME, FK_STORE_LOCATION_ID) VALUES
('ST01', 'STORE 1', 1);
- 所以,现在当用户向我分享他的位置(纬度/经度)时,我需要搜索指定半径内所有附近的商店位置。
我尝试了以下查询,但遇到了错误:
SELECT
s.store_code,
s.store_name,
loc.zip,
loc.address,
loc.geo_location
FROM store_detail s,
store_locate loc
where MDSYS.SDO_WITHIN_DISTANCE(loc.geo_location,
(MDSYS.SDO_GEOMETRY(2001, 8307,
MDSYS.SDO_POINT_TYPE(80.21456732,26.23117864, NULL) ,NULL, NULL)),
'distance=1000 unit=KM') = 'TRUE';
得到以下错误:
ORA-29900: operator binding does not exist
ORA-06553: PLS-306: wrong number or types of arguments in call to 'SDO_WITHIN_DISTANCE'
29900. 00000 - "operator binding does not exist"
*Cause: There is no binding for the current usage of the operator.
*Action: Change the operator arguments to match any of the existing
bindings or add a new binding to the operator.
我现在想了一会儿,但徒劳无功。
参考:
- https://issues.redhat.com/browse/TEIID-751?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel
- https://docs.oracle.com/cd/E17781_01/appdev.112/e18750/xe_locator.htm#XELOC562
问题:
- 这是在 Oracle SQL 上执行位置搜索的正确方法吗?
- 如果以上不正确,有没有其他办法?
【问题讨论】:
标签: database oracle geospatial oracle-spatial