ORA-06502: PL / SQL: ошибка с числом или значением: массовая привязка: усеченная привязка ORA-06512 - PullRequest
0 голосов
/ 20 июня 2019

У меня проблема с BULK COLLECT в Oracle. Я получаю "ORA-06502: PL / SQL: ошибка с числом или значением: Массовая привязка: Усеченная привязка ORA-06512 "при попытке заполнить" report_tab "в конце блока ниже. Как вы можете видеть, я использую BULK COLLECT для других таблиц и работает нормально.

Я заметил, что есть разница между таблицами в разных базах данных. Два столбца были определены как CHAR в одной БД и как BYTE в другой БД. Теперь я изменил это, но все еще получаю ошибку. Есть идеи?

DECLARE
old_schedule_id_ NUMBER;
new_schedule_id_ NUMBER;
TYPE schedule_type IS TABLE OF loc_schedule%ROWTYPE;
schedule_tab          schedule_type := schedule_type();

TYPE bindvar_type IS TABLE OF loc_sched_bindvar%ROWTYPE;
bindvar_tab          bindvar_type := bindvar_type();

TYPE param_type IS TABLE OF loc_sched_param%ROWTYPE;
param_tab          param_type := param_type();

destination_rec       loc_sched_destination%ROWTYPE;
format_rec            loc_sched_format%ROWTYPE;

TYPE report_type IS TABLE OF loc_client_report%ROWTYPE;
report_tab          report_type := report_type();

CURSOR get_schedules(company_id_ IN VARCHAR) IS
    SELECT *
    FROM loc_schedule@owprod5link s
    WHERE s.client_id = company_id_;

CURSOR get_destination(schedule_id_ IN NUMBER) IS
    SELECT *
    FROM loc_sched_destination@owprod5link sd
    WHERE sd.SCHEDULE_ID = schedule_id_;

CURSOR get_format(schedule_id_ IN NUMBER) IS
    SELECT *
    FROM loc_sched_format@owprod5link sf
    WHERE sf.SCHEDULE_ID = schedule_id_;

CURSOR get_bindvar(schedule_id_ IN NUMBER) IS
    SELECT *
    FROM loc_sched_bindvar@owprod5link bv
    WHERE bv.SCHEDULE_ID = schedule_id_;

CURSOR get_params(schedule_id_ IN NUMBER) IS
    SELECT *
    FROM loc_sched_param@owprod5link par
    WHERE par.SCHEDULE_ID = schedule_id_;

CURSOR get_reports(company_id_ IN VARCHAR) IS
    SELECT *
    FROM loc_client_report@owprod5link r
    WHERE r.client_id = company_id_;


BEGIN
OPEN get_schedules(:client_id); 
FETCH get_schedules BULK COLLECT INTO schedule_tab;
CLOSE get_schedules; 

FOR I IN schedule_tab.first .. schedule_tab.last LOOP
    old_schedule_id_ := schedule_tab(I).schedule_id;
    new_schedule_id_ := LOC_SCHEDULE_TEST_SEQ.nextval();
    schedule_tab(I).schedule_id := new_schedule_id_;
    schedule_tab(I).client_id := :new_client_id_;
    INSERT INTO loc_schedule_test VALUES schedule_tab(I);

    OPEN get_destination(old_schedule_id_); 
    FETCH get_destination INTO destination_rec;
    CLOSE get_destination;
    destination_rec.schedule_id := new_schedule_id_;
    destination_rec.destination_id := 
LOC_SCHED_DESTINATION_TEST_SEQ.nextval;
    INSERT INTO loc_sched_destination_test VALUES destination_rec;

    OPEN get_format(old_schedule_id_); 
    FETCH get_format INTO format_rec;
    CLOSE get_format;
    format_rec.schedule_id := new_schedule_id_;
    format_rec.format_id := LOC_SCHED_FORMAT_TEST_SEQ.nextval;
    INSERT INTO loc_sched_format_test VALUES format_rec;

    OPEN get_bindvar(old_schedule_id_); 
    FETCH get_bindvar BULK COLLECT INTO bindvar_tab;
    CLOSE get_bindvar;
    IF(bindvar_tab.count>0) THEN
        FOR I IN bindvar_tab.first .. bindvar_tab.last LOOP
            bindvar_tab(I).schedule_id := new_schedule_id_;
            bindvar_tab(i).bindvar_id := 
LOC_SCHED_BINDVAR_TEST_SEQ.nextval;
            INSERT INTO loc_sched_bindvar_test VALUES bindvar_tab(I);
        END LOOP;
    END IF;

    OPEN get_params(old_schedule_id_); 
    FETCH get_params BULK COLLECT INTO param_tab;
    CLOSE get_params;
    IF(param_tab.count>0) THEN
        FOR I IN param_tab.first .. param_tab.last LOOP
            param_tab(I).schedule_id := new_schedule_id_;
            param_tab(i).param_id := LOC_SCHED_PARAM_TEST_SEQ.nextval;
            INSERT INTO loc_sched_param_test VALUES param_tab(I);
        END LOOP;
    END IF;
END LOOP;

OPEN get_reports(:client_id); 
FETCH get_reports BULK COLLECT INTO report_tab;
CLOSE get_reports; 
FOR I IN report_tab.first .. report_tab.last LOOP
    report_tab(I).client_id := :new_client_id_;
    INSERT INTO loc_client_report_test VALUES report_tab(I);
END LOOP;
END;

Обновление: проблема решена! Когда я объявил все столбцы таблицы как CHAR вместо BYTE, это сработало.

...