procedure ins_note (pi_data in note_detail_arr) is begin FOR i IN pi_data.first..pi_data.last loop 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 pi_data(i).channel_id := 'XLS'; END IF; INSERT INTO note_msg (template_id,channel_id) VALUES ( pi_data(i).template_id, pi_data(i).channel_id); end loop; commit; end;
Advertisement
Answer
pi_data is a an array of elements that is an IN argument. You cannot assign values to IN argument. Declare a local variable to store the channel_id, or declare a local variable of type note_msg%ROWTYPE and use that instead for storing channel id. You have not mentioned what the declaration is of note_detail_arr so I’m defining a local variable of ROWTYPE. Example:
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;