pi_data - это массив элементов, который является аргументом IN. Вы не можете присвоить значения аргументу IN. Объявите локальную переменную для хранения channel_id или объявите локальную переменную типа note_msg% ROWTYPE и используйте ее для хранения идентификатора канала. Вы не упомянули, что такое объявление note_detail_arr, поэтому я определяю локальную переменную ROWTYPE. Пример:
procedure ins_note(pi_data IN note_detail_arr)
is
l_note_msg_row note_msg%ROWTYPE;
BEGIN
FOR i IN pi_data.first..pi_data.last LOOP
l_note_msg_row.channel_id := pi_data(i).channel_id;
IF
pi_data(i).template_id IN (022, 019, 015, 017, 021, 001, 010, 016, 018, 020, 023 ) AND pi_data(i).channel_id IS NULL
THEN
l_note_msg_row.channel_id := 'XLS';
END IF;
INSERT INTO note_msg (
template_id,
channel_id
) VALUES (
pi_data(i).template_id,
l_note_msg_row.channel_id
);
END LOOP;
-- you should not commit in your procedure. Instead only commit when your complete transaction is done from code that calls this proc.
COMMIT;
END ins_note;