首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLDeveloper :争论不够

SQLDeveloper :争论不够
EN

Stack Overflow用户
提问于 2014-11-12 16:41:21
回答 1查看 3K关注 0票数 0

我正在编写一个APEX应用程序,它利用空间来通过谷歌搜索API进行邻近搜索,我构建了这个函数,它编译得很好,但是每当我试图在SQLDeveloper中运行它时,我就会得到错误的not enough arguments

我为设置新的lat/long点而创建的函数从我的stores表中获取一个邮政编码输入,然后它使用Google返回该邮政编码的长lat同弦,它在返回时构建一个SDO_GEOMETRY对象,该对象在stores表中的location列中被返回和设置。

功能代码:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION set_spatial_point
( 
    -- Only accept postcodes from the store table
    p_postcode stores.postcode%TYPE
)
    RETURN MDSYS.SDO_GEOMETRY
IS
    -- Build local variables
    l_lng      VARCHAR2(100);
    l_lat      VARCHAR2(100);
    n_spatial_object MDSYS.SDO_GEOMETRY;
BEGIN
    -- Populate long and lat parameters
    POSTCODE_TO_LAT_LNG_GM_API(p_postcode, l_lat, l_lng);

    -- Populate the new spatial object
    n_spatial_object := MDSYS.SDO_GEOMETRY
    (
        -- use 01 as we wish to add the point to the map
        2001, 
        -- SRID for WGS84 longitutde/latitude format
        8307,
         -- Set the information of the point ( we don't need a Z co-ord )
        SDO_POINT_TYPE
        (
            l_lng,
            l_lat,
            null
         ),
        null,   -- We have no SDO_ELEM_INFO_ARRAY
        null    -- We have no SDO_ORDINATE_ARRAY
    );

    -- Return the new spatial object
    dbms_output.put_line('sdo_gtype='||n_spatial_object.sdo_gtype);
    dbms_output.put_line('first element from sdo_ordinates='||n_spatial_object.sdo_ordinates(1));
    RETURN n_spatial_object;
END set_spatial_point;

为什么我会得到不足够的参数错误,即使我用一个有效的stores.postcode%TYPE调用它(我已经尝试更改为VARCHAR2,但这没有任何区别)。

编辑:在创建函数之后,我运行对方法的调用:

代码语言:javascript
复制
DECLARE
   my_object    MDSYS.SDO_GEOMETRY;  
BEGIN
  my_object := set_spatial_value('MK80PB');
END;

我现在得到以下错误:

代码语言:javascript
复制
Error starting at line : 1 in command -
DECLARE
  my_object    MDSYS.SDO_GEOMETRY;  
BEGIN
my_object := set_spatial_value('MK80PB');
END;
Error report -
ORA-06550: line 4, column 14:
PLS-00201: identifier 'SET_SPATIAL_VALUE' must be declared
ORA-06550: line 4, column 1:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 19:51:52

您得到的错误是显而易见的:您将函数创建为SET_SPATIAL_POINT(),但是您调用了SET_SPATIAL_VALUE(),这显然失败了,因为它不存在。

现在,让我们试试这个。我不得不替换您的一些代码,因为我没有存储表或Google调用的声明,所以我对调用的结果进行了硬编码:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION set_spatial_point
( 
    -- Only accept postcodes from the store table
    p_postcode varchar2
)
    RETURN SDO_GEOMETRY
IS
    -- Build local variables
    l_lng      VARCHAR2(100);
    l_lat      VARCHAR2(100);
    n_spatial_object SDO_GEOMETRY;
BEGIN
    -- Populate long and lat parameters
    -- POSTCODE_TO_LAT_LNG_GM_API(p_postcode, l_lat, l_lng);
    l_lat:=45.3;
    l_lng:= 3.7;

    -- Populate the new spatial object
    n_spatial_object := SDO_GEOMETRY
    (
        -- use 01 as we wish to add the point to the map
        2001, 
        -- SRID for WGS84 longitutde/latitude format
        8307,
         -- Set the information of the point ( we don't need a Z co-ord )
        SDO_POINT_TYPE
        (
            l_lng,
            l_lat,
            null
         ),
        null,   -- We have no SDO_ELEM_INFO_ARRAY
        null    -- We have no SDO_ORDINATE_ARRAY
    );

    -- Return the new spatial object
    dbms_output.put_line('sdo_gtype='||n_spatial_object.sdo_gtype);
    dbms_output.put_line('first element from sdo_ordinates='||n_spatial_object.sdo_ordinates(1));
    RETURN n_spatial_object;
END set_spatial_point;
/
show errors

效果很好。

我们试试看:

代码语言:javascript
复制
SQL> select set_spatial_point('XXXX') from dual;
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at "SCOTT.SET_SPATIAL_POINT", line 38

再一次,这是显而易见的。错误出现在第38行:

代码语言:javascript
复制
        dbms_output.put_line('first element from sdo_ordinates='||n_spatial_object.sdo_ordinates(1));

由于n_spatial_object.sdo_ordinates()为null (就像您在第32行中所写的那样),这将失败(显然再次发生)。

让我们移除那些调试行并重新定义函数。那我们试试吧。它现在如预期的那样运作:

代码语言:javascript
复制
SQL> select set_spatial_point('XXXX') from dual;

SET_SPATIAL_POINT('XXXX')(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INF
-------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(3.7, 45.3, NULL), NULL, NULL)

1 row selected.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26892025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档