¿Cuando se da este problema?
Cuando tenes una función con muchas tablas temporales encerradas en un ciclo, por ejemplo:
Abrir Cursor
Recorrer Cursor
{
-- Esta funcion tiene tablas temporables aunque en el mismo se eliminan con un drop
-- siempre quedan en memoria mientras se recorre el cursor
Llamar Funcion();
}
Cerrar Cursor
SOLUCION
Abrir Cursor
Recorrer Cursor
{
-- Pegar directamente la consulta de la función
SELECT * FROM tabla;
}
Cerrar Cursor
y si las funciones no tienen ninguna tabla temporal? porque podría pasar este error?. porque si le pongo un Limit a toda la consulta, si sale, pero con mas data ya me sale el error de memoria compartida agotada
ResponderEliminarHola Omar, segun la experiencia que he tenido, ese error aparece dependiendo del número de veces que se invoque la función o a las funciones, y a la vez depende de las tablas temporales y el tamaño de información que contiene cada como tu mismo lo has mencionado.
EliminarEste comentario ha sido eliminado por el autor.
EliminarHola Francisco, encontré la solución. Tenias razón sobre las funciones que tienen temporales y que aun haciendo Drop a las tablas, aun guarda espacio en memoria; encontré la funcion con las tablas temporales dentro de 2 funciones mas.
ResponderEliminarLa solución que encontré fue que en vez de copiar toda la función, creas esa tabla temporal en la funcion principal.
Siguiendo tu lógica sería así:
Primero modificamos la manera de crear la tabla en la funcion que contiene la temporal,
IF NOT EXISTS (Select count(1) from TablaTemporal) THEN
create local temp TablaTemporal ();
ELSE
truncate table TablaTemporal
END IF
Luego procedemos a modificar la funcion principal que llama a la Funcion():
--Crear la misma tabla temporal de la Funcion() aquí antes de entrar al bucle.
create local temp TablaTemporal ()
Abrir Cursor
Recorrer Cursor
{
-- Esta funcion tiene tablas temporables aunque en el mismo se eliminan con un drop
-- siempre quedan en memoria mientras se recorre el cursor,
Llamar Funcion();
}
Cerrar Cursor
Con eso la función "Funcion()" quedara habilitado para lo que fue creado en un principio, y para las demás funciones que quieran usarla