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



      

Responder a