У меня проблемы с использованием Bulk Bind в PL / SQL.В основном я хочу, чтобы таблица (Component) обновляла свое значение поля в зависимости от Component_id и fieldname.Все они передаются как параметры (тип varchar2_nested_table - это эффективно и массив строк, один элемент для каждого оператора обновления, который должен произойти).Так, например, если Component_id = 'Compid1' и fieldname = 'name', тогда fieldvalue должно быть обновлено, чтобы быть 'новым именем компонента'.
Я набрал код ниже относительно этого http://www.oracle.com/technetwork/issue-archive/o14tech-plsql-l2-091157.html.Код работает, но не быстрее простого цикла, который выполняет обновление для каждого элемента в параметрах IN.Таким образом, если параметры имеют 1000 элементов, то будет выполнено 1000 операторов обновления.Я также понимаю, что не использую BULK COLLECT INTO, но я не думал, что мне это нужно, так как мне не нужно ничего выбирать из базы данных, просто обновите.
В данный момент обе операции занимают 4-5секунд на 1000 обновлений.Я предполагаю, что я использую массовое связывание неправильно или у меня неправильное понимание предмета, поскольку в примерах я могу обнаружить, что люди выполняют 50 000 строк за 2 секунды и т. Д. Насколько я понимаю, FORALL должен повысить производительность за счет уменьшения количества переключений контекста.Я попробовал другой метод, который я нашел онлайн, используя курсоры и массовые привязки, но у меня был тот же результат.Возможно, мои ожидания по производительности слишком велики?Я так не думаю, увидев результаты других.Любая помощь будет принята с благодарностью.
create or replace procedure BulkUpdate(sendSubject_in IN varchar2_nested_table_type,
fieldname_in IN varchar2_nested_table_type,fieldvalue_in IN varchar2_nested_table_type) is
TYPE component_aat IS TABLE OF component.component_id%TYPE
INDEX BY PLS_INTEGER;
TYPE fieldname_aat IS TABLE OF component.fieldname%TYPE
INDEX BY PLS_INTEGER;
TYPE fieldvalue_aat IS TABLE OF component.fieldvalue%TYPE
INDEX BY PLS_INTEGER;
fieldnames fieldname_aat;
fieldvalues fieldvalue_aat;
approved_components component_aat;
PROCEDURE partition_eligibility
IS
BEGIN
FOR indx IN sendSubject_in.FIRST .. sendSubject_in.LAST
LOOP
approved_components(indx) := sendSubject_in(indx);
fieldnames(indx):= fieldname_in(indx);
fieldvalues(indx) := fieldvalue_in(indx);
END LOOP;
END;
PROCEDURE update_components
IS
BEGIN
FORALL indx IN approved_components.FIRST .. approved_components.LAST
UPDATE Component
SET Fieldvalue = fieldvalues(indx)
WHERE Component_id = approved_components(indx)
AND Fieldname = fieldnames(indx);
END;
BEGIN
partition_eligibility;
update_components;
END BulkUpdate;