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

Responder a