Ahi te va... Así lo haría yo en Oracle:
--- COMIENZA SCRIPT ----
-- *** PREPARACION *** ---
-- Creamos la tabla temporal
CREATE GLOBAL TEMPORARY TABLE explode_results
(key_name varchar2(10) NOT NULL)
ON COMMIT DELETE ROWS; -- IMPORTANTE! Depende de la aplicación,
-- quizá sea necesario
-- Usar ON COMMIT PRESERVE
ROWS
-- La tabla que contiene nuestros datos
CREATE TABLE LMA_DATA
(key_name varchar2(10) NOT NULL,
key_repeat integer DEFAULT 1 NOT NULL);
-- Y damos de alta unos datos falsos, solo para prueba.
INSERT INTO LMA_DATA
(key_name, key_repeat) VALUES ('Luis', 2);
INSERT INTO LMA_DATA
(key_name, key_repeat) VALUES ('Juan', 3);
INSERT INTO LMA_DATA
(key_name, key_repeat) VALUES ('Pedro', 2);
COMMIT;
-- Verificamos que los datos estén ahí y sean lo que esperamos.
select * from lma_data;
-- Ahora tendremos que crear una función que 'explote' los registros cada vez
que
-- es llamada, poniendo los resultados en la tabla temporal.
CREATE OR REPLACE FUNCTION f_explode RETURN VARCHAR2 is
begin
delete from explode_results; -- Limpiar la tabla para evitar registros
repetidos.
-- Con un loop sobre un cursor implícito para sacar los datos primero
for record in (
SELECT key_name, key_repeat
FROM lma_data
WHERE key_repeat > 0
)
loop
-- Dentro, un loop sobre el numero de repeticiones que necesitamos
for i in 1..record.key_repeat loop
INSERT INTO explode_results
(key_name)
VALUES
(record.key_name);
end loop;
end loop;
return 'OK';
exception
when OTHERS then
return 'Ocurrió un error al explotar datos.' || sqlerrm;
end f_explode;
/
show errors;
--- *** TERMINA PREPARACIÓN *** ---
--- /SCRIPT ----
-- Listo! Solo hay que recordar que antes de seleccionar de explode_results,
-- ejecutar la función que 'explota' . Supongo que usarás un stored procedure
-- El codigo de la ejecución se va a ver así:
declare
result varchar2(100);
begin
result := f_explode;
dbms_output.put_line (result);
end;
select * from explode_results;
Cuando corro el script el resultado es :
--- RESULTADO ---
Table created.
Table created.
1 row created.
1 row created.
1 row created.
Commit complete.
KEY_NAME KEY_REPEAT
---------- ----------
Luis 2
Juan 3
Pedro 2
3 rows selected.
Function created.
No errors.
PL/SQL procedure successfully completed.
KEY_NAME
----------
Luis
Luis
Juan
Juan
Juan
Pedro
Pedro
7 rows selected.
--- /RESULTADO ---
Ahora los disclaimers:
Yo he usado esta solución en dos ocasiones. En una de ellas los datos
originales solo cambiaban una vez al dia, de tal manera que yo corría un
procedimiento al iniciar la sesión que generaba los datos 'explotados' y
felizmente hacía el SELECT las veces que yo quisiera (siempre y cuanto se
preserve la sesión).
En otra ocasión, yo no sabía si los datos iban a cambiar o no durante el
transcurso de la sesión, por lo que tuve que asegurarme que CADA vez que iban a
hacer el SELECT, previamente se ejecutara la función f_explode(). Si este es el
caso, recomiendo usar ON COMMIT DELETE ROWS a la hora de crear la tabla
temporal.
FInalmente, no tengo mas datos de lo que quieres hacer ni de la necesidad que
te obliga a hacer esta pregunta. A lo mejor esta solución no es la correcta
para tu problema. Si quieres, podemos continuar el OT más privadamente. Mándame
correo directamente a [email protected] y con gusto te sigo ayudando.
-Luis
--------------------------------------------------------------------
Luis Miguel Arteaga Mejía - Huntsville, AL, USA
http://www.arteaga.com.mx/paginas/contacto
--------------------------------------------------------------------
--- On Tue, 7/27/10, FER <[email protected]> wrote:
From: FER <[email protected]>
Subject: Re: [GLO] [OT] Explosion de registros
To: [email protected]
Date: Tuesday, July 27, 2010, 11:20 AM
me serviria muchisimo :)
2010/7/27 Luis Miguel Arteaga Mejía <[email protected]>
> contenido se destruye tan pronto como abandonas la sesión. Si estás usando
> Oracle, te puedo mandar la solución tal y como yo he resuelto este problema.
--
Fernando Legorreta
Programmer Analyst
Mobile: +(521)3314103136