2013-04-26 2 views
2

У меня есть пакет с функцией в нем, как и следующая, которая ожидает один из параметров, который является массивом.Невозможно вызвать функцию Oracle

create or replace PACKAGE selected_pkg IS 

TYPE NUM_ARRAY IS TABLE OF NUMBER; 

FUNCTION get_selected_kml(
    in_layer  IN NUMBER, 
    in_solm_id  IN NUMBER, 
    in_feature_ids IN NUM_ARRAY, 
    in_lx   IN NUMBER, 
    in_ly   IN NUMBER, 
    in_ux   IN NUMBER, 
    in_uy   IN NUMBER) 
RETURN CLOB; 

END selected_pkg; 

Теперь я пытаюсь вызвать функцию из следующих анонимного блока:

declare 
    result CLOB; 
    TYPE NUM_ARRAY1 IS TABLE OF NUMBER; 
    myarray NUM_ARRAY1 := NUM_ARRAY1(); 
begin 
    myarray.extend(3); 
    myarray(1) := 1; 
    myarray(2) := 5; 
    myarray(3) := 9; 
    EXECUTE IMMEDIATE 'truncate table demoresult'; 
    result:=SELECTED_PKG.get_selected_kml(103, 19, myarray, 4.11, 56.27, 4.59, 56.39); 
    insert into demoresult values(result); 
    COMMIT; 
end; 

Я получаю ошибку

PLS-00306: wrong number or types of arguments in call to 'GET_SELECTED_KML'

Может кто-то пожалуйста предложить мне, что я делаю не так?

Спасибо, Alankar

+2

Вы в основном ударяя [это ограничение совместимости данных] (http://docs.oracle .com/CD/E11882_01/appdev.112/e25519/composites.htm # autoId15); хотя типы вашей коллекции имеют один и тот же тип элемента, они не рассматриваются как эквивалентные. Поэтому вы пытаетесь вызвать функцию с другим типом, которую она ожидает. Как показывает ответ Джастина, вы должны использовать точно такой же тип коллекции. –

ответ

4

Вы должны использовать один и тот же тип массива, что ваша функция ожидает

declare 
    result CLOB; 
    myarray selected_pkg.num_array := selected_pkg.num_array(); 
begin 
    myarray.extend(3); 
    myarray(1) := 1; 
    myarray(2) := 5; 
    myarray(3) := 9; 
    EXECUTE IMMEDIATE 'truncate table demoresult'; 
    result:=SELECTED_PKG.get_selected_kml(103, 19, myarray, 4.11, 56.27, 4.59, 56.39); 
    insert into demoresult values(result); 
    COMMIT; 
end; 
+0

Спасибо, Джастин, получилось! – AlanShar

+0

Если я использую что-то вроде ниже, то также получаю ошибку: Объявление результат CLOB; myarray selected_pkg.num_array: = selected_pkg.num_array(); начало myarray.extend (3); myarray (1): = 1; myarray (2): = 5; myarray (3): = 9; EXECUTE IMMEDIATE 'выберите column_value из таблицы (cast (myarray AS selected_pkg.num_array))'; COMMIT; конец; Пожалуйста, предложите. Спасибо, Alan – AlanShar