Почему вы создаете две процедуры и функцию?Это легко может быть одна процедура.Поскольку первоначальная процедура, которую вы вызываете, вызывает две другие, вы ничего не получаете, разбивая ее и делая ее намного более сложной.ссылочные столбцы в rowtype
в forall
.Есть несколько способов обойти это: Во-первых, как предположил Олли, в вашей таблице должно быть столько же столбцов, сколько в bulk collect
.Это не всегда возможно.
Том Кайт предлагает операции над множествами.Ограничением является размер bulk collect
, который вы делаете.Если оно больше, чем количество отмен, у вас будут проблемы.Кроме того, если вы хотите сделать что-то еще с данными, то вы должны сделать это отдельно.
Последний вариант (я знаю, что я уверен, что их больше) состоит в том, чтобы собрать ваши записи в отдельные types
вместо rowtype
согласно следующему.Недостатком этого является то, что он может быть не таким быстрым, как метод Тома, и он ни в коем случае не так ясен, как метод Олли.
Я только что заметил Сатья метод , который также будет работать, но требует много SQL для выполнения.
PROCEDURE archive_things ( p_part_id IN NUMBER ) IS
CURSOR c_get_all ( Cpart_id char) is
SELECT file_attachment_bean (id, hot_part_id, file_name
, file_type, attachment, auditable)
FROM hot_part_attachments
WHERE hot_part_id = Cpart_id;
t_id bean_list.id%type;
t_hot_part_id bean_list.hot_part_id%type;
t_file_name bean_list.file_name%type;
t_file_type bean_list.file_type%type;
t_attachment bean_list.attachment%type;
t_auditable bean_list.auditable%type;
BEGIN
OPEN c_get_all(p_part_id);
FETCH c_get_all bulk collect into
t_id, t_hot_part_id, t_file_name, t_file_type, t_attachment, t_auditable;
LOOP
EXIT WHEN t_id.count = 0;
FORALL x IN t_id.first .. t_id.last
INSERT INTO deleted_hot_part_attachments (id, hot_part_id, file_name, file_type
, attachment, auditable)
VALUES ( t_id(x), t_hot_part_id(x), t_file_name(x), t_file_type(x)
, t_attachment(x), t_auditable(x) );
COMMIT; -- You may want to do this outside the procedure.
END LOOP;
CLOSE c_get_all;
END;