Estou executando o Oracle 11g R1 em minha máquina de desenvolvimento local.
Tenho tentado rodar um bloco anônimo para testar a FORALL
instrução no Oracle para inserir 25.000 registros.
Estou tendo o erro a seguir:
ORA-04031: unable to allocate 4708660 bytes of shared memory ("shared pool","DECLARE
-- temp_rec temp%R...","PL/SQL SOURCE","PLD: Source Heap")
04031. 00000 - "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"
*Cause: More shared memory is needed than was allocated in the shared
pool.
*Action: If the shared pool is out of memory, either use the
dbms_shared_pool package to pin large packages,
reduce your use of shared memory, or increase the amount of
available shared memory by increasing the value of the
INIT.ORA parameters "shared_pool_reserved_size" and
"shared_pool_size".
If the large pool is out of memory, increase the INIT.ORA
parameter "large_pool_size".
Eu tentei olhar aqui e aqui, mas não consegui resolver esse problema.
Eu tentei o seguinte:
ALTER SYSTEM FLUSH BUFFER_CACHE;
ALTER SYSTEM FLUSH SHARED_POOL;
ALTER SYSTEM SET cursor_sharing = 'SIMILAR' SCOPE=BOTH;
Por favor ajude.
EDITAR
O código que estou usando é o seguinte:
DECLARE
TYPE t_varchar IS TABLE OF varchar(512 char);
biz_hierarchy t_varchar := t_varchar();
project_team t_varchar := t_varchar();
user_roles t_varchar := t_varchar();
username t_varchar := t_varchar();
sso t_varchar := t_varchar();
BEGIN
SELECT *
BULK COLLECT INTO biz_hierarchy, project_team, user_roles, username, sso
FROM ... -- Query fetches 25000 records
FORALL i IN biz_hierarchy.FIRST..biz_hierarchy.LAST
INSERT INTO temp VALUES (biz_hierarchy(i), project_team(i),
user_roles(i), username(i), sso(i));
END;
/
O erro retornado pelo Oracle não menciona o número da linha. Se eu tentar carregar 5.000 registros, o bloco de código será executado com sucesso. Falha quando tento com 25000.
Eu recomendo limitar o número de linhas que você busca em seu BULK COLLECT e envolver tudo dentro de um loop:
consulte Asktom sobre coleta em grande volume para obter mais informações
Pode haver 2 problemas aqui: você está ficando sem memória ao usar uma coleta em massa ou ao usar um forAll (tente um de cada vez para descobrir o problema). Eu recomendo a abordagem de Frank. é uma maneira realmente real de trabalhar com coletas em massa