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