类型参数

时间:2017-11-15 10:10:02

标签: sql oracle plsql apex

我正在尝试执行一个简单的查询,以获取包含从一个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返回输入变量中的纬度和经度,我已经测试了它并且它正常工作。

任何帮助都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:2)

您没有显示完整的错误堆栈,并且该消息似乎与修改后的代码不一致,但看起来您正在嵌入字符串文字L_LATITUDEL_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;