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:
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 :--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;
Código:
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)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,
De esta manera armé un procedure que quedo así:
Código:
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_POTPROCEDURE 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;
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