To com um problema aqui q ta me dando dor de cabeça desde sexta-feira e ñ consegui ninguém q conseguisse identificar o erro dentro da empresa, então to apelando XP
Estou com uma melhoria de performance em uma package, onde o cliente quer q o tempo de execução seja diminuido de 7 para 3 horas.
Para isso, decidi adotar o uso de tabelas temporárias para fazer o JOIN entre as tabelas usando uma massa menos de dados, pois são 3 tabelas gigantescas.
De inicio eu estava usando um for simples no cursor, mas a execução ainda estava meio lenta, porque a transação era commitada a cada linha inserida na tabela temporária, ai me aconselharam usar o comando BULK COLLECT. A partir dai começou minha dor de cabeça.
Estou implementando o código da seguinte forma:
OPEN C_CCONTACT(P_DATA_CORTE_INICIO, P_DATA_CORTE_FIM);
LOOP
FETCH C_CCONTACT BULK COLLECT INTO REC_CC LIMIT 10000;
FORALL i IN REC_CC.FIRST .. REC_CC.COUNT
INSERT INTO BSCS_CLARIFY_TMP_CCONTACT
VALUES REC_CC(i);
COMMIT;
EXIT WHEN C_CCONTACT%NOTFOUND;
END LOOP;
No primeiro fetch ele passa e insere 10000 registros na tabela temporária, porém no segundo ele dá o seguinte erro:
ORA-01461: can bind a LONG value only for insert into a LONG column
Diminui o limit para 10 para ver se isso resolvia, ele inseriu 60 registros na coluna, mas na 7ª passagem pelo fetch deu o mesmo erro.
Ja descartei a possibilidade de incossitência no banco e inserção de valores em campo errado.
Me falaram pra usar um for simples com controle de commit, mas eu queria ver se eu sanava esse problema por 2 motivos:
1º. Não é apenas 1 cursor que está assim, só deu erro nele porque ele é o primeiro, então se eu modificar somente ele o risco de dar erro nos outros é alto, e vai dar muito trabalho modificar o código inteiro.
Fiz isso com controle de commit em um for simples e deu certo, só q ficou um monstrinho, pq a tabela tem 72 campos.
Por enquanto vou deixar assim, mas caso alguém saiba q problema q é esse q eu descrevi, por favor me falem.