0

Googlemaps API を介した近接検索に空間を利用する APEX アプリケーションを作成しています。関数を作成しましたが、正常にコンパイルされますが、SQLDeveloper で実行しようとするとエラーが発生しますnot enough arguments

新しい緯度/経度ポイントを設定するために作成した関数は、テーブルから郵便番号を 1 つ入力storesし、Google マップ API を使用してその郵便番号の緯度経度を返します。返されたSDO_GEOMETRYオブジェクトを構築します。表のlocation列に設定しstoresます。

機能コード:

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たが、違いはありません。)

編集: 関数を作成した後、メソッドへの呼び出しを実行します。

DECLARE
   my_object    MDSYS.SDO_GEOMETRY;  
BEGIN
  my_object := set_spatial_value('MK80PB');
END;

次のエラーが表示されます。

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:
4

1 に答える 1

1

発生するエラーは明らかです。関数を SET_SPATIAL_POINT() として作成しますが、SET_SPATIAL_VALUE() を呼び出すと、存在しないため明らかに失敗します。

では、これを試してみましょう。STORES テーブルまたは Google 呼び出しの宣言がないため、コードの一部を置き換える必要があったため、その呼び出しの結果をハードコーディングしました。

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

それはうまくいきます。

試してみましょう:

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 行目にあります。

        dbms_output.put_line('first element from sdo_ordinates='||n_spatial_object.sdo_ordinates(1));

n_spatial_object.sdo_ordinates() がnullであるため、(明らかに再び)失敗します(32行目に書いたように.

これらのデバッグ行を削除して、関数を再定義しましょう。それでは試してみましょう。期待どおりに動作するようになりました。

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.
于 2014-11-13T19:51:52.037 に答える