Pular para o conteúdo

Fóruns SQL e PL/SQL bulk collect update limit bulk collect update limit

#93243
fsitja
Participante

    Bom, se você quer fazer um update mesmo (ou milhões deles), quem sou eu para impedir, certo… dá para tentar, sem ter ideia de quanto tempo vai levar.

    Não entendi sua regra para preencher a coluna nova… É o mesmo valor para todas as linhas?

    Qual versão do Oracle você está rodando? Para versões antes do 11g há a tal restrição de implementação que mencionei acima, por isso você não vai conseguir usar forall. Mas de toda forma dá para contornar.

    Misturei um pouco as coisas, para update nem precisa usar gambiarra com multiset e cast mas vai precisar criar object type de qualquer forma (os create type não permitem usar %rowtype ou %type… 👿 ).

    Passe a lógica de preencher a coluna que dá para fazer algo mais preciso.
    —————————————————————————————————————————————————

    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
    Connected as FSITJA

    SQL>
    SQL> set serveroutput on
    SQL> create table t1 (id_t1 number(10) primary key, tipo varchar2(20));

    Table created
    SQL> insert into t1 (id_t1, tipo) values (1, 'X');

    1 row inserted
    SQL> insert into t1 (id_t1, tipo) values (2, 'X');

    1 row inserted
    SQL> insert into t1 (id_t1, tipo) values (3, 'X');

    1 row inserted
    SQL> insert into t1 (id_t1, tipo) values (4, 'X');

    1 row inserted
    SQL> insert into t1 (id_t1, tipo) values (5, 'X');

    1 row inserted
    SQL> commit;

    Commit complete
    SQL> create or replace type typ_t1 as object (id_t1 number(10),
    2 tipo varchar2(20))
    3 /

    Type created
    SQL> create or replace type typ_tab_t1 is table of typ_t1
    2 /

    Type created
    SQL> declare
    2 tab_t1 typ_tab_t1;
    3 cursor cur_t1 is
    4 select typ_t1(id_t1, tipo) from t1;
    5 begin
    6 open cur_t1;
    7 loop
    8 fetch cur_t1 bulk collect
    9 into tab_t1 limit 2;
    10 update t1 set t1.tipo = 'Y'
    11 where t1.id_t1 in (select t.id_t1 from table(tab_t1) t);
    12 dbms_output.put_line('Update em ' || sql%rowcount || ' linhas.');
    13 commit;
    14 exit when cur_t1%notfound;
    15 end loop;
    16 dbms_output.put_line('Total de linhas atualizadas: ' || cur_t1%rowcount);
    17 close cur_t1;
    18 end;
    19 /

    Update em 2 linhas.
    Update em 2 linhas.
    Update em 1 linhas.
    Total de linhas atualizadas: 5

    PL/SQL procedure successfully completed
    SQL> drop type typ_tab_t1;

    Type dropped
    SQL> drop type typ_t1;

    Type dropped
    SQL> select *
    2 from t1;

    ID_T1 TIPO
    ----------- --------------------
    1 Y
    2 Y
    3 Y
    4 Y
    5 Y

    SQL>

    Provavelmente no seu caso teria que colocar um filtro no where do cursor pegando apenas as linhas com flg_ori is null caso tenha que continuar por motivo de erro ou qualquer interrupção no processamento.