Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

INSERT por cada registro de un SELECT

Estas en el tema de INSERT por cada registro de un SELECT en el foro de Bases de Datos General en Foros del Web. Saludos, tengo un pequeño problemas mas por desconocimiento que por duda sucede que debo realizar un INSERT por cada registro que me bote un SELECT, ...
  #1 (permalink)  
Antiguo 25/08/2010, 08:46
 
Fecha de Ingreso: septiembre-2009
Ubicación: Lima
Mensajes: 12
Antigüedad: 14 años, 7 meses
Puntos: 0
INSERT por cada registro de un SELECT

Saludos, tengo un pequeño problemas mas por desconocimiento que por duda sucede que debo realizar un INSERT por cada registro que me bote un SELECT, por ejemplo:

select * from t_rolxusuario where in_idrol=50
---------------------------------------------------------------------
in_idrol | in_idusuario | fecha_registro | in_habilitado |
--50-------- 1--------- 2010-08-25 ------ 1---- |
--50-------- 2--------- 2010-08-25 ------ 1 ---- |
--50-------- 3--------- 2010-08-25 ------ 1 ---- |
--50-------- 4--------- 2010-08-25 ------ 1 ---- |
--50-------- 5--------- 2010-08-25 ------ 1 ---- |
---------------------------------------------------------------------

Lo que necesito es que por cada registro que devuelva el SELECT de arriba
se haga un INSERT en la misma tabla pero con otro in_idrol, la logica seria algo como:

SI (in_idrol==50) ENTONCES
INSERT into t_rolxusuario (in_idrol, in_idusuario, fecha_registro, in_habilitado)
values (60,
Aqui iria el in_idusuario del 1er registro luego del 2do, 3 ro y asi tanta veces como registros haya devuelto el SELECT de arriba, fechaDeHoy que no es problema, 1)

supongo que todo esto se deberia manejar algo asi como con un loop tal como se hace en cualquier lenguaje de programacion ejemplo JAVA.

Pero solo con queries y PL/SQL no se como hacerlo si alguien puede ayudarme por favor. Ah la BD que uso es DB2.
  #2 (permalink)  
Antiguo 25/08/2010, 08:51
 
Fecha de Ingreso: julio-2010
Mensajes: 2
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: INSERT por cada registro de un SELECT

Hola ricardo aqui te dejo un script que hace otro script para que puedas hacer algo de lo que tu dices.

Código SQL:
Ver original
  1. DECLARE CURSOR LISTTABLAS
  2.             IS  
  3.     SELECT COUNT(t.COLUMN_NAME) col ,T.TABLE_NAME nombreTabla FROM USER_TAB_COLUMNS t GROUP BY T.TABLE_NAME;
  4.  
  5.     TYPE CUR_TYPE IS REF CURSOR;
  6.     TABLA CUR_TYPE;
  7.  
  8.    nombre_Tabla VARCHAR2(30);
  9.    colu INTEGER;
  10.    str_query varchar2(1000);
  11.    str_into varchar2(9999);
  12.    str_values varchar2(9999);
  13.    columna VARCHAR2(1000);  
  14.    contador INT ;
  15.     BEGIN
  16.    
  17.            OPEN  LISTTABLAS;
  18.            LOOP
  19.              FETCH LISTTABLAS INTO colu,nombre_Tabla;
  20.              EXIT WHEN LISTTABLAS%NOTFOUND;
  21.              dbms_output.put_line('------------INICIO----------------');
  22.                          -- dbms_output.put_line(nombre_Tabla); --- IMPRIME LA TABLA
  23.                          dbms_output.put('select ''');
  24.                           dbms_output.put('INSERT '||nombre_Tabla||' INTO( ');
  25.                           str_into:='';    
  26.                           str_values:='';                    
  27.                                str_query := ' SELECT COLUMN_NAME columna FROM USER_TAB_COLUMNS WHERE TABLE_NAME= '''||UPPER(nombre_Tabla)||'''';
  28.                                                                                    
  29.                                                     OPEN TABLA FOR str_query;
  30.                                                       contador:=1;
  31.                                                           LOOP
  32.                                                                 FETCH TABLA INTO columna;                                        
  33.                                                                 EXIT WHEN TABLA%NOTFOUND;  
  34.                                                                
  35.                                                                 IF(contador<colu)  THEN                                                            
  36.                                                                  str_into:=str_into||' '||columna||', ';
  37.                                                                  str_values:=str_values||'''''|| '||columna||' ||'''''',''';
  38.                                                                 ELSE
  39.                                                                  str_into:=str_into||' '||columna;
  40.                                                                  str_values:=str_values||'''''|| '||columna||' ||''''';                                                                
  41.                                                                 END IF;
  42.                                                                 contador:=contador+1;
  43.                                                           END LOOP;
  44.                                                      CLOSE TABLA;
  45.  
  46.                                             dbms_output.put(str_into||') VALUES ('''||str_values||''');');
  47.                                             dbms_output.put_line(''' INSERT_ FROM '||nombre_Tabla);
  48.                          dbms_output.put_line('------------FIN----------------');
  49.  
  50.              
  51.            END LOOP;
  52.                CLOSE LISTTABLAS;
  53.     END;

puebalo de algo te debe servir.
  #3 (permalink)  
Antiguo 25/08/2010, 13:34
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: INSERT por cada registro de un SELECT

cricardo84
cuando haces una consulta a tu tabla te muestra los datos como dices?
Con base en esta salida, necesitarías replicar esta información?

O como están tus datos normalmente?

No logro entender.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 25/08/2010, 16:18
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: INSERT por cada registro de un SELECT

Cita:
Iniciado por dpwalter Ver Mensaje
Hola ricardo aqui te dejo un script que hace otro script para que puedas hacer algo de lo que tu dices.

Código SQL:
Ver original
  1. DECLARE CURSOR LISTTABLAS
  2.             IS  
  3.     SELECT COUNT(t.COLUMN_NAME) col ,T.TABLE_NAME nombreTabla FROM USER_TAB_COLUMNS t GROUP BY T.TABLE_NAME;
  4.  
  5.     TYPE CUR_TYPE IS REF CURSOR;
  6.     TABLA CUR_TYPE;
  7.  
  8.    nombre_Tabla VARCHAR2(30);
  9.    colu INTEGER;
  10.    str_query varchar2(1000);
  11.    str_into varchar2(9999);
  12.    str_values varchar2(9999);
  13.    columna VARCHAR2(1000);  
  14.    contador INT ;
  15.     BEGIN
  16.    
  17.            OPEN  LISTTABLAS;
  18.            LOOP
  19.              FETCH LISTTABLAS INTO colu,nombre_Tabla;
  20.              EXIT WHEN LISTTABLAS%NOTFOUND;
  21.              dbms_output.put_line('------------INICIO----------------');
  22.                          -- dbms_output.put_line(nombre_Tabla); --- IMPRIME LA TABLA
  23.                          dbms_output.put('select ''');
  24.                           dbms_output.put('INSERT '||nombre_Tabla||' INTO( ');
  25.                           str_into:='';    
  26.                           str_values:='';                    
  27.                                str_query := ' SELECT COLUMN_NAME columna FROM USER_TAB_COLUMNS WHERE TABLE_NAME= '''||UPPER(nombre_Tabla)||'''';
  28.                                                                                    
  29.                                                     OPEN TABLA FOR str_query;
  30.                                                       contador:=1;
  31.                                                           LOOP
  32.                                                                 FETCH TABLA INTO columna;                                        
  33.                                                                 EXIT WHEN TABLA%NOTFOUND;  
  34.                                                                
  35.                                                                 IF(contador<colu)  THEN                                                            
  36.                                                                  str_into:=str_into||' '||columna||', ';
  37.                                                                  str_values:=str_values||'''''|| '||columna||' ||'''''',''';
  38.                                                                 ELSE
  39.                                                                  str_into:=str_into||' '||columna;
  40.                                                                  str_values:=str_values||'''''|| '||columna||' ||''''';                                                                
  41.                                                                 END IF;
  42.                                                                 contador:=contador+1;
  43.                                                           END LOOP;
  44.                                                      CLOSE TABLA;
  45.  
  46.                                             dbms_output.put(str_into||') VALUES ('''||str_values||''');');
  47.                                             dbms_output.put_line(''' INSERT_ FROM '||nombre_Tabla);
  48.                          dbms_output.put_line('------------FIN----------------');
  49.  
  50.              
  51.            END LOOP;
  52.                CLOSE LISTTABLAS;
  53.     END;

puebalo de algo te debe servir.
Un cursor?? eso consume demasiada memoria, seria mejor hacerlo con un while y una tabla temporal para almacenar los resultados no???
  #5 (permalink)  
Antiguo 25/08/2010, 17:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: INSERT por cada registro de un SELECT

Poco importa si se demora un poco mas con tablas temporales o con cursores, si el bloque será ejecutado una sola vez para organizar una serie de datos.
cricardo84 debe darnos un poco mas de información
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 28/08/2010, 18:19
 
Fecha de Ingreso: septiembre-2009
Ubicación: Lima
Mensajes: 12
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: INSERT por cada registro de un SELECT

bueno gracias por su colaboración al final logre hacerlo: tenia algunos errores de sintaxis. Gracias a todos...!!! :D
  #7 (permalink)  
Antiguo 28/08/2010, 18:37
 
Fecha de Ingreso: septiembre-2009
Ubicación: Lima
Mensajes: 12
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: INSERT por cada registro de un SELECT

Cita:
Iniciado por Libras Ver Mensaje
Un cursor?? eso consume demasiada memoria, seria mejor hacerlo con un while y una tabla temporal para almacenar los resultados no???
Y como sería posible eso me enseñarias por favor????
  #8 (permalink)  
Antiguo 28/08/2010, 21:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: INSERT por cada registro de un SELECT

Cita:
Iniciado por cricardo84 Ver Mensaje
Y como sería posible eso me enseñarias por favor????
Perdón, pero ¿tienes algún problema en la vista que te obligue a escribir siempre como si gritaras?
Constantemente veo posts tienen este tamaño de letras. ¿Hay alguna razón en especial?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: insert, registro, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:20.