Получение ошибки при присвоении значения переменной коллекции - PullRequest
0 голосов
/ 28 мая 2020
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;              

1 Ответ

0 голосов
/ 28 мая 2020

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;
...