Gracias! 2010/7/27 Luis Miguel Arteaga Mejía <larte...@yahoo.com>
> 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 larte...@yahoo.com 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 <ferm...@gmail.com> wrote: > > From: FER <ferm...@gmail.com> > Subject: Re: [GLO] [OT] Explosion de registros > To: glo@glo.org.mx > Date: Tuesday, July 27, 2010, 11:20 AM > > me serviria muchisimo :) > > 2010/7/27 Luis Miguel Arteaga Mejía <larte...@yahoo.com> > > > 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 > > > > > -- Fernando Legorreta Programmer Analyst Mobile: +(521)3314103136