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

Insert/Update desde un rango de tablas

Estas en el tema de Insert/Update desde un rango de tablas en el foro de Oracle en Foros del Web. Hola, espero que puedan ayudarme en esto. Estoy trabajando en un procedure que realice los DML necesarios desde un rango de tablas (noa_ave ET y ...
  #1 (permalink)  
Antiguo 08/03/2013, 09:01
 
Fecha de Ingreso: octubre-2011
Ubicación: Merlo
Mensajes: 18
Antigüedad: 12 años, 6 meses
Puntos: 1
Exclamación Insert/Update desde un rango de tablas

Hola, espero que puedan ayudarme en esto.
Estoy trabajando en un procedure que realice los DML necesarios desde un rango de tablas (noa_ave ET y noa_ave_max EPE), sobre un tercer rango de tablas. Esto debería ser dinámico.

Las tablas origen son:

Código:
desc noa_ave ET

  UTCTIME      TIMESTAMP(6)                     NOT NULL,
  POINTNUMBER  INTEGER                          NOT NULL,
  VALUE        FLOAT(126)                       DEFAULT (0.0),
  TLQ          INTEGER                          DEFAULT (32)

desc noa_ave_max EPE

  UTCTIME      TIMESTAMP(6)                     NOT NULL,
  POINTNUMBER  INTEGER                          NOT NULL,
  VALUE        FLOAT(126)                       DEFAULT (0.0),
  TLQ          INTEGER                          DEFAULT (32),
  UTCTIMEMAX   DATE

Los rangos de las tablas los obtengo con:


Código:
--Lista tablas ET 
  
SELECT TABLE_NAME
            FROM USER_TABLES
            WHERE TABLE_NAME NOT LIKE '%MAX%'
            AND TABLE_NAME NOT LIKE '%MIN%'
            AND TABLE_NAME LIKE 'NOA_%' 

--Cursor            
DECLARE 
  CURSOR c_lista_tablas 
  IS
  SELECT TABLE_NAME
            FROM USER_TABLES
            WHERE TABLE_NAME NOT LIKE '%MAX%'
            AND TABLE_NAME NOT LIKE '%MIN%'
            AND TABLE_NAME LIKE 'NOA_%';
  
  registro c_lista_tablas%ROWTYPE;
BEGIN
  OPEN c_lista_tablas;
  FETCH c_lista_tablas INTO registro;
  CLOSE c_lista_tablas;
END;  

-- Lista tablas EPE

SELECT TABLE_NAME
            FROM USER_TABLES
            WHERE table_name LIKE 'NOA_%_MAX'
            ORDER BY TABLE_NAME ASC;

-- Cursor            
DECLARE 
  CURSOR c_lista_tablas_max
  IS
  SELECT TABLE_NAME
            FROM USER_TABLES
            WHERE table_name LIKE 'NOA_%_MAX'
            ORDER BY TABLE_NAME ASC;
  registro_max c_lista_tablas_max%ROWTYPE;
BEGIN
  OPEN c_lista_tablas_max;
  FETCH c_lista_tablas_max INTO registro_max;
  CLOSE c_lista_tablas_max;
END;
Hasta ahi obtengo el rango de tablas origen de los datos, y los guardo en registros. El select que me devuelve los datos a insertar/updatear es :

Código:
select a.utctime, a.pointnumber, a.value POT_ET, a.tlq, b.utctimemax, max(b.value) POT_EPE
						from noa_ave a, noa_ave_max b
						where a.utctime = b.utctimemax
						and a.utctime > sysdate -2
						group by a.utctime, a.pointnumber, a.value, a.tlq, b.utctimemax, b.value;

--Salida
UTCTIME,                   POINTNUMBER, POT_ET, TLQ, UTCTIMEMAX,             POT_EPE
03/06/2013 0:35:00, 118000,           10,         32,   03/06/2013 0:35:00, 3000,
Con esto obtengo los datos de las tablas ET, que se corresponden al mismo momento UTCTIMEMAX de las tablas EPE, junto con el max(value), por día (solo lo hago una vez por día, por tabla)

De esta manera armé un procedure que quedo así:

Código:
   PROCEDURE UPDATE_ALL_POINTNUMBER(P_DATE               IN DATE,
                                     P_OWNER            IN VARCHAR2 DEFAULT NULL,
                                     P_COMMIT           IN BOOLEAN DEFAULT FALSE)
    IS
       CURSOR c_lista_tablas IS
            SELECT TABLE_NAME
            FROM ALL_TABLES
            WHERE TABLE_NAME NOT LIKE '%MAX%'
            AND TABLE_NAME NOT LIKE '%MIN%'
            AND TABLE_NAME LIKE 'NOA_%'
            and owner = 'TEST' 
            ORDER BY TABLE_NAME ASC;
        
    v_owner           all_tables.owner%type;
    v_table_name all_tables.table_name%type;
    
       CURSOR c_lista_tablas_max IS
            SELECT TABLE_NAME
            FROM ALL_TABLES
            WHERE table_name LIKE 'NOA_%_MAX'
            AND OWNER = 'TEST'
            ORDER BY TABLE_NAME ASC;

    v_owner_max           all_tables.owner%type;
    v_table_name_max all_tables.table_name%type;
 
            
    BEGIN
        NULL;
        
        OPEN c_lista_tablas;
        LOOP
           FETCH c_lista_tablas INTO  v_table_name;
           EXIT WHEN c_lista_tablas%NOTFOUND;
           
           BEGIN
           
                    update_max_x_table(v_table_name,  v_table_name || '_DIA' ,p_date, p_commit);
                    
           EXCEPTION
                WHEN OTHERS THEN
                    DBMS_OUTPUT.PUT_LINE(SQLCODE || ' - ' || SQLERRM);
           END;
                       
        END LOOP;
        CLOSE c_lista_tablas;
        
        OPEN c_lista_tablas_max;
        LOOP
           FETCH c_lista_tablas_max INTO  v_table_name_max;
           EXIT WHEN c_lista_tablas_max%NOTFOUND;
           
           BEGIN
           
                    update_max_x_table(v_table_name_max,  v_table_name_max || '_POT' ,p_date, p_commit);
                    
           EXCEPTION
                WHEN OTHERS THEN
                    DBMS_OUTPUT.PUT_LINE(SQLCODE || ' - ' || SQLERRM);
           END;
                       
        END LOOP;
        CLOSE c_lista_tablas_max;                
        
    END;
La pregunta es: como armar un segundo procedure update_max_x_table, que contenga el select y que realice los update/insert desde las tablas de los rangos obtenidos en los registros, a nuevas tablas que también pertenencen a un nuevo rango NOA_AVE_POT

Estoy estancado aqui, y no cuento con demasiada experiencia en PL-SQL

Me gustaría recibir ayuda para resolver mi problema.

Agradecido a quien puediera darme una mano.

Saludos!


Carlino

Etiquetas: dinamicos, pl-sql, procedures, sql
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 16:47.