SQLDeveloper: недостаточно аргументов
Я пишу приложение APEX, которое использует пространственный поиск для близости, через API Googlemaps, я построил функцию, и она прекрасно компилируется, однако всякий раз, когда я пытаюсь запустить его в SQLDeveloper, я получаю ошибку not enough arguments
,
Функция, которую я создал, чтобы установить новую точку широты / долготы, берет один ввод почтового индекса из моего stores
Затем он использует API-интерфейс Google map для возврата длинных лат-кодов для этого почтового индекса, который при возврате создает 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:
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.