Oracle空间数据库,如何使用SDO_NN_DISTANCE?

时间:2015-11-11 00:36:59

标签: oracle spatial-query oracle-spatial

我有两个表:Lion(Lion_id(varchar2(5)),position(mdsys.sdo_geometry))和Pond(Pond_id(varchar2(5)),shape(mdsys.sdo_geometry))。我在Lion.position和Pond.shape上创建了空间索引。

我想找到距离狮子L2最近的3个池塘。最近邻居必须从最近的邻居订购。

最初,我尝试以下查询:

SELECT P.POND_ID
FROM POND P,LION L
WHERE L.LION_ID='L2' AND
MDSYS.SDO_NN(P.SHAPE,L.POSITION,'SDO_NUM_RES=3')='TRUE';

此查询成功运行。但是,当我尝试另一个时:

SELECT P.POND_ID,SDO_NN_DISTANCE(1) DIS
FROM POND P,LION L
WHERE L.LION_ID='L2' AND
MDSYS.SDO_NN(P.SHAPE,L.POSITION,'SDO_NUM_RES=3',1)='TRUE'
ORDER BY DIS;

出现错误:

ORA-13249: SDO_NN cannot be evaluated without using index
ORA-06512: in "MDSYS.MD", line 1723
ORA-06512: in "MDSYS.MDERR", line 17
ORA-06512: in "MDSYS.PRVT_IDX", line 9

我该如何解决这个问题?我是Oracle新手,这是我数据库课程的作业。

有人能帮帮我吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。 我需要添加一个提示。

SELECT /*+ LEADING(L) USE_NL(L P) INDEX(P POND_INDEX)*/
P.POND_ID, SDO_NN_DISTANCE(1) DIS
FROM POND P,LION L
WHERE L.LION_ID='L2' AND
MDSYS.SDO_NN(P.SHAPE,L.POSITION,'SDO_NUM_RES=3',1)='TRUE'
ORDER BY DIS;

然后错误就解决了。