конструктор связанного массива не найден при компиляции хранимой процедуры - PullRequest
0 голосов
/ 18 октября 2018

При использовании типа, который уже определен в пакете как

Type ArrError Is Table Of Varchar2(20) Index By Binary_Integer;

и объявление его следующим образом в хранимой процедуре

arr_error(1) := PKG_TEST.arrerror(p_error);

приводит к следующей ошибке PLS-00222: no function with name 'ARRERROR' exists in this scope,В приведенном выше утверждении p_error имеет тип VARCHAR2

При использовании глобального типа, созданного с помощью команды CREATE TYPE, это работает нормально.используя вышеуказанную инициализацию в блоке CREATE PROCEDURE.

1 Ответ

0 голосов
/ 18 октября 2018

Вам не нужно инициализировать, если вы получили Index by ...

declare
    TYPE ArrError IS TABLE OF VARCHAR2 (20) index by binary_integer;
    arr_error ArrError;

    p_error varchar2(20) := 'test';
    p_error2 varchar2(20) := 'test2';
begin
    arr_error(1) := p_error;
    arr_error(2) := p_error2;
    dbms_output.put_line('arr_error(1): ' || arr_error(1)); 
    dbms_output.put_line('arr_error(2): ' || arr_error(2)); 
end;

Если у вас нет index by ..., вам нужно вызвать конструктор:

declare
    TYPE ArrError IS TABLE OF VARCHAR2 (20);
    arr_error ArrError;

    p_error varchar2(20) := 'test';
    p_error2 varchar2(20) := 'test2';
begin
    -- Needed because of no 'Indexed by'. Or else you get a 'ORA-06531' not initialized..
    arr_error := ArrError(p_error); 
    arr_error.extend;

    arr_error(2) := p_error2;
    dbms_output.put_line('arr_error(1): ' || arr_error(1)); 
    dbms_output.put_line('arr_error(2): ' || arr_error(2)); 
end;
...