我正在尝试执行一个简单的查询,以获取包含从一个SDO_GEOMETRY到另一个SDO_GEOMETRY的距离的距离列。
我的代码如下
DECLARE query VARCHAR(4000); L_LATITUDE number; L_LONGITUDE number;
BEGIN
IF :P7_USER_POSTCODE IS NOT NULL THEN
brian.GEOCODE_GM_JSON (:P7_USER_POSTCODE, L_LATITUDE, L_LONGITUDE);
END IF;
query := 'SELECT
S.SPOT_ID,
dbms_lob.getlength("THUMBNAIL") "THUMBNAIL",
IND.SPOT_NAME,
IND.SPOT_DESCRIPTION,
SPOT.POSTCODE
FROM SPOT_IMAGES S
INNER JOIN SURFSPOTINDEX IND ON IND.SPOT_ID = S.SPOT_ID
INNER JOIN SPOT_LOCATION SPOT ON SPOT.SPOT_ID = IND.SPOT_ID';
IF :P7_SEARCH IS NULL AND :P7_USER_POSTCODE IS NULL THEN
return query;
ELSIF :P7_SEARCH IS NOT null AND :P7_USER_POSTCODE IS NULL THEN
query := query || ' ' ||
'WHERE CONTAINS(IND.SPOT_DESCRIPTION, :P7_SEARCH, 123) > 0
OR UPPER(IND.SPOT_NAME) LIKE UPPER(''%'' || :P7_SEARCH || ''%'')
';
RETURN query;
ELSIF :P7_SEARCH IS null AND :P7_USER_POSTCODE IS NOT NULL THEN
query := 'SELECT
S.SPOT_ID,
dbms_lob.getlength("THUMBNAIL") "THUMBNAIL",
IND.SPOT_NAME,
IND.SPOT_DESCRIPTION,
SPOT.POSTCODE,
ASDO_GEOM.SDO_DISTANCE(SPOT.LOCATION,
SDO_GEOMETRY(2001,
4326,
SDO_POINT_TYPE(L_LONGITUDE, L_LATITUDE, null),
null,
null)
,0.005, ''unit=mile'') as DISTANCE
FROM SPOT_IMAGES S
INNER JOIN SURFSPOTINDEX IND ON IND.SPOT_ID = S.SPOT_ID
INNER JOIN SPOT_LOCATION SPOT ON SPOT.SPOT_ID = IND.SPOT_ID
ORDER BY Distance ASC';
RETURN query;
END IF;
END;
最后的if if是错误发生的地方。
我收到错误
ORA-00904: "LONGITUDE": invalid identifier
我无法弄清楚为什么广泛使用Google搜索错误代码。 GEOCODE_GM_JSON返回输入变量中的纬度和经度,我已经测试了它并且它正常工作。
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:2)
您没有显示完整的错误堆栈,并且该消息似乎与修改后的代码不一致,但看起来您正在嵌入字符串文字L_LATITUDE
和L_LONGITUDE
你要返回的查询字符串;但是这些变量在尝试运行生成的代码时对调用者没有任何意义。
您可以在实际变量值中连接:
ASDO_GEOM.SDO_DISTANCE(SPOT.LOCATION,
SDO_GEOMETRY(2001,
4326,
SDO_POINT_TYPE('
|| L_LONGITUDE ||', '|| L_LATITUDE
||', null),
null,
null)
,0.005, ''unit=mile'') as DISTANCE
虽然这意味着由于这些文字值,每个查询都必须进行硬解析。如果Apex在执行查询时可以引用该绑定变量,那么返回后置代码的SDO点而不是纬度和经度的另一个函数可能会更好 - 使用:P7_SEARCH
暗示前一个分支中的查询它可以。这将删除连接,删除硬解析并减少SQL注入的可能性。
答案 1 :(得分:0)
您可以使用DEFINE
来使用外部变量。然后在查询中将其用作&variable_name
。
DEFINE LATITUDE = 50.5261556;
DEFINE LONGITUDE = -5.5261556;
SELECT
S.SPOT_ID,
dbms_lob.getlength("THUMBNAIL") "THUMBNAIL",
IND.SPOT_NAME,
IND.SPOT_DESCRIPTION,
SPOT.POSTCODE,
SDO_GEOM.SDO_DISTANCE(SPOT.LOCATION,
SDO_GEOMETRY(2001,
4326,
SDO_POINT_TYPE(&LATITUDE, &LONGITUDE, null),
null,
null)
,0.005, 'unit=mile')
FROM SPOT_IMAGES S
INNER JOIN SURFSPOTINDEX IND ON IND.SPOT_ID = S.SPOT_ID
INNER JOIN SPOT_LOCATION SPOT ON SPOT.SPOT_ID = IND.SPOT_ID;