Dúvida Oracle

8 respostas
criador

Bom dia.

Estou com o seguinte problema usando a base de dados Oracle:

ORA-04030: sem espaço de memória para processo durante tentativa de alocação de
16396 bytes (koh-kghu call ,kollalo2)

Alguém poderia me especificar melhor o erro ???

Abraços!

8 Respostas

Nicolas_Fernandes

Olá, criador!

O que exatamente você está tentando fazer?

[]s

criador

Criei um PL/SQL que faz select em uma tabela com 38884 linhas.
Após isto, estou fazendo um for e dando update e commit em cada uma das 38884 linhas.

Porém, ocorre esta exceção.

Espero ter sido claro!

Abraços!

Tchello

A mensagem diz tudo.
O servidor não tem memória pra alocar os 12837123781381230981203712037213012931 registros.
Procure alternativas.
Alocar todos os registros assim não costuma ser uma boa, justamente por consumirem muito mais recursos.

Nicolas_Fernandes

Realmente, é como o Tchello diz.
O Oracle, ao fazer uma operação de Update, transfere os dados antigos para uma memória, e só então atualiza. Você está fazendo operações com 123617236712637126731263 registros, e isso estoura a capacidade do gerenciador, né?

Talvez uma solução diferente para a sua operação possa resolver o problema!

criador
begin

	declare
	cursor			lc_TABELA
	is
	select		Coluna1,
				Coluna2,
				UTL_RAW.cast_to_varchar2(Coluna_Blob)
					"Coluna_Blob"
		from		TABELA
		where	Coluna2	is not null
				and
				Nome	=	'Rafael'
	;

	begin
		for	lc_VLTB			in	lc_TABELA
		loop
			update			TABELA
				set		Data_Atual		=	Data_Atual,
						Coluna2	=	lc_VLTB.Coluna_Blob
				where		Coluna1		=	lc_VLTB.Coluna1
			;

			commit;

		end loop;
	end;
end;

Este é o meu PL/SQL.

Onde posso melhorá-lo ???

Abraços!

criador

Só para conhecimento:

O comando UTL_RAW.cast_to_varchar2(Coluna_Blob) transforma um valor para VARCHAR2…

Neste meu caso, o valor era 393635363536323030.
Usando este comando, é transformado para 965656200.
Ou seja, é transformado de Hexadecimal para String

Abraço!

Nicolas_Fernandes

Esse seu campo blob é uma foto, algo do tipo?
É realmente necessário usá-lo na operação?
Porque não atualizá-lo somente quando houver alterações sobre ele?

Execute sua procedure sem atualizar o campo Blob para ver no que dá!

criador

É completamente necessário.

Na verdade, é EXATAMENTE dele que vou tirar o valor para atualizar a coluna.

Já testei sem utilizá-lo… Está ocorrendo o mesmo problema!

Criado 6 de setembro de 2010
Ultima resposta 6 de set. de 2010
Respostas 8
Participantes 3