sql - PLSQL DML statements inside procedure -


i trying execute below procedure says me use bulkcollect , forall refactor code. warning or should not use below procedure. if so, how should modify code iterating through array , need each value update table.

create or replace procedure schema.pr_validate  ( filearray in strarray, duparray out strarray, passarray out strarray, failarray out strarray, missarray out strarray )  dupcount number; stacode    varchar2 (10); filename varchar2 (50); dupfilename varchar2(50); fileid number; id varchar2(20); begin in 1 .. filearray.count    loop      filename := filearray(i);        select count (t.fileid), t.fileid,t.status,t.id dupcount,fileid,stacode,id tb_table_name t, tb_table_name s      t.fileid=s.fileid      , t.status=s.status      , t.filename = filename , t.status in ('pass', 'fail)      group t.fileid,t.status,t.id;        if dupcount>1            select filename dupfilename tb_table_1      status in ('pass','fail') , fileid=fileid      , filename != filename;      dbms_output.put_line(dupfilename);       update tb_table_1 set status='dup' filename=dupfilename;      duparray(duparray.last +1 ) :=dupfilename;      dbms_output.put_line(dupfilename);      end if;       if stacode = 'fail'           failarray(failarray.last+1) :=filename;      elsif stacode = 'pass'           passarray(passarray.last+1) :=filename;      end if;     end loop;   exception     when no_data_found     stacode :=null;     missarray(missarray.last +1 ) :=filename;     when others         pr_errors('pr_validate', sqlerrm);        rollback;  end; 

/

as mentioned in comment forall here out of context business logic incorporated here again can try bulk collect loop iterate. data volume not large can still go row-by-row approach. hope below snippet helps. there single quotes missing have given compile time error.

create or replace procedure schema.pr_validate(     filearray in strarray,     duparray out strarray,     passarray out strarray,     failarray out strarray,     missarray out strarray )   dupcount    number;   stacode     varchar2 (10);   filename    varchar2 (50);   dupfilename varchar2(50);   fileid      number;   id          varchar2(20); begin   in 1 .. filearray.count   loop     filename := filearray(i);     select count (t.fileid),       t.fileid,       t.status,       t.id     dupcount,       fileid,       stacode,       id     tb_table_name t,       tb_table_name s     t.fileid =s.fileid     , t.status   =s.status     , t.filename = filename     , t.status  in ('pass', 'fail')     group t.fileid,       t.status,       t.id;     if dupcount>1       select filename       dupfilename       tb_table_1       status in ('pass','fail')       , fileid    =fileid       , filename != filename;       dbms_output.put_line(dupfilename);        update tb_table_1        set status='dup'        filename=dupfilename;        duparray(duparray.last +1 ) :=dupfilename;       dbms_output.put_line(dupfilename);     end if;      if stacode                     = 'fail'       failarray(failarray.last+1) :=filename;     elsif stacode                  = 'pass'       passarray(passarray.last+1) :=filename;     end if;   end loop; exception when no_data_found   stacode                       :=null;   missarray(missarray.last +1 ) :=filename; when others   pr_errors('pr_validate', sqlerrm);   rollback; end;