montei um script com um ambiente semelhante ao seu..
pra fazer um update usando forall, você teria 2 opcoes, ou cria uma variavel pra cada campo que o cursor vai usar, ou você pode usar um object type como no exemplo abaixo... qualquer dúvida é só perguntar!
Selecionar tudo
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as ccm
SQL>
SQL> drop table tabela1
2 /
Table dropped
SQL> drop table tabela2
2 /
Table dropped
SQL> drop table tabela3
2 /
Table dropped
SQL> drop type tbl_tabela
2 /
Type dropped
SQL> drop type typ_tabela
2 /
Type dropped
SQL> create table TABELA2
2 (nrc number(3)
3 ,id_status_pc number(3)
4 ,id_status_conta number(3)
5 ,id_localidade number(3)
6 ,terminal number(3)
7 ,cod_subtp_produto_comercial number(3)
8 ,dt_ins_prqe date
9 ,in_stop_faturamento varchar(1)
10 ,seg_ant number(3)
11 ,seg_cnta number(3)
12 ,sistema number(3)
13 ,produto_comercial varchar(1)
14 ,dt_ini_cnta date
15 )
16 /
Table created
SQL> create table TABELA1
2 (nrc number(3)
3 ,id_status_pc number(3)
4 ,id_status_pc_ant number(3)
5 ,id_status_conta number(3)
6 ,id_status_conta_ant number(3)
7 ,id_localidade_ant number(3)
8 ,id_localidade number(3)
9 ,terminal number(3)
10 ,classe_ant number(3)
11 ,cod_subtp_produto_comercial number(3)
12 ,cod_subtp_prod_com_ant number(3)
13 ,dt_ins_prqe_ant date
14 ,dt_ins_prqe date
15 ,in_stop_fat_ant varchar(1)
16 ,in_stop_faturamento varchar(1)
17 ,seg_ant number(3)
18 ,seg_cnta number(3)
19 ,flag_atis varchar(1)
20 ,sistema number(3)
21 ,produto_comercial varchar(1)
22 ,dt_ini_cnta date
23 ,sis_ant number(3)
24 ,sis_atu number(3)
25 )
26 /
Table created
SQL> create table TABELA3
2 (produto_comercial varchar(1)
3 ,sistema number(3)
4 ,dt_ini_cnta date
5 )
6 /
Table created
SQL> insert into tabela1 (nrc
2 ,id_status_pc
3 ,id_status_conta
4 ,id_localidade
5 ,terminal
6 ,cod_subtp_produto_comercial
7 ,cod_subtp_prod_com_ant
8 ,dt_ins_prqe_ant
9 ,dt_ins_prqe
10 ,in_stop_fat_ant
11 ,in_stop_faturamento
12 ,seg_ant
13 ,seg_cnta
14 ,flag_atis
15 ,sistema
16 ,produto_comercial
17 ,dt_ini_cnta
18 ,sis_ant
19 ,sis_atu)
20 values (1
21 ,12
22 ,13
23 ,14
24 ,123
25 ,333
26 ,444
27 ,trunc(sysdate)
28 ,trunc(sysdate)
29 ,'A'
30 ,'F'
31 ,888
32 ,999
33 ,'X'
34 ,10
35 ,'1'
36 ,trunc(sysdate)
37 ,10
38 ,10)
39 /
1 row inserted
SQL> insert into tabela2 (nrc
2 ,id_status_pc
3 ,id_status_conta
4 ,id_localidade
5 ,terminal
6 ,cod_subtp_produto_comercial
7 ,dt_ins_prqe
8 ,in_stop_faturamento
9 ,seg_ant
10 ,seg_cnta
11 ,sistema
12 ,produto_comercial
13 ,dt_ini_cnta)
14 values (1
15 ,12
16 ,13
17 ,14
18 ,123
19 ,333
20 ,trunc(sysdate)
21 ,'F'
22 ,888
23 ,999
24 ,10
25 ,'1'
26 ,trunc(sysdate))
27 /
1 row inserted
SQL> insert into TABELA3 values ('1',10,trunc(sysdate))
2 /
1 row inserted
SQL> CREATE OR REPLACE TYPE typ_tabela AS object (linha varchar(18)
2 ,nrc number(3)
3 ,id_status_pc number(3)
4 ,id_status_conta number(3)
5 ,id_localidade number(3)
6 ,terminal number(3)
7 ,cod_subtp_produto_comercial number(3)
8 ,dt_ins_prqe date
9 ,in_stop_faturamento varchar(1)
10 ,seg_ant number(3)
11 ,seg_cnta number(3)
12 )
13 /
Type created
SQL> CREATE TYPE tbl_tabela AS TABLE OF typ_tabela;
2 /
Type created
SQL> declare
2 v_dt_inicio timestamp;
3 v_dt_fim timestamp;
4
5 cursor c1 is
6 select typ_tabela(a.rowid,
7 b.nrc,
8 b.id_status_pc,
9 b.id_status_conta,
10 b.id_localidade,
11 b.terminal,
12 b.cod_subtp_produto_comercial,
13 b.dt_ins_prqe,
14 b.in_stop_faturamento,
15 a.seg_ant,
16 a.seg_cnta)
17 from tabela1 a
18 ,tabela2 b
19 where a.flag_atis is not null
20 and nvl(a.sis_ant, a.sis_atu) = b.sistema
21 and a.produto_comercial = b.produto_comercial
22 and b.dt_ini_cnta = (select max(c.dt_ini_cnta)
23 from tabela3 c
24 where c.produto_comercial = b.produto_comercial
25 and b.sistema = c.sistema);
26
27 t_tabela tbl_tabela;
28 begin
29 open c1;
30 loop
31 fetch c1 bulk collect
32 into t_tabela limit 1000;
33 exit when t_tabela.count = 0;
34
35 forall i in 1 .. t_tabela.count
36 update tabela1 a
37 set a.nrc = treat(t_tabela(i) as typ_tabela).nrc
38 ,a.id_status_pc_ant = treat(t_tabela(i) as typ_tabela).id_status_pc
39 ,a.id_status_conta_ant = treat(t_tabela(i) as typ_tabela).id_status_conta
40 ,a.id_localidade_ant = treat(t_tabela(i) as typ_tabela).id_localidade
41 ,a.terminal = treat(t_tabela(i) as typ_tabela).terminal
42 ,a.classe_ant = treat(t_tabela(i) as typ_tabela).cod_subtp_produto_comercial
43 ,a.cod_subtp_prod_com_ant = treat(t_tabela(i) as typ_tabela).cod_subtp_produto_comercial
44 ,a.dt_ins_prqe_ant = treat(t_tabela(i) as typ_tabela).dt_ins_prqe
45 ,a.in_stop_fat_ant = treat(t_tabela(i) as typ_tabela).in_stop_faturamento
46 ,a.seg_ant = treat(t_tabela(i) as typ_tabela).seg_ant
47 where rowid = treat(t_tabela(i) as typ_tabela).linha;
48 dbms_output.put_line('Linha atualizadas : '|| sql%rowcount);
49 end loop;
50 close c1;
51 end;
52 /
Linha atualizadas : 1
PL/SQL procedure successfully completed