salve , ho il seguente blocco anonimo :
DECLARE
CURSOR curs
IS
SELECT DISTINCT case_id_li
FROM insert_job_sedi_temp;
l curs%ROWTYPE;
n INTEGER := 0;
BEGIN
OPEN curs;
LOOP
FETCH curs
INTO l;
EXIT WHEN curs%NOTFOUND;
EXECUTE IMMEDIATE 'TRUNCATE TABLE CURS_TABLE';
INSERT INTO curs_table
(case_id_li, sede_new, dt_fine, dt_inizio)
SELECT case_id_li, sede_new, dt_fine, dt_inizio
FROM crma.insert_job_sedi_temp
WHERE sede_new IS NOT NULL AND case_id_li = l.case_id_li
ORDER BY case_id_li, dt_inizio;
FOR m IN
(SELECT case_id_li, sede_new, dt_inizio,
NVL
(LEAD (dt_inizio) OVER (PARTITION BY case_id_li ORDER BY case_id_li,
dt_inizio),
'01-GEN-2100'
) succ_dt_inizio,
dt_fine
FROM crma.curs_table
WHERE case_id_li = l.case_id_li
ORDER BY case_id_li, dt_inizio)
LOOP
UPDATE /*+parallel(4)*/ insert_job_sedi
SET sede_new = m.sede_new
WHERE case_id_li = m.case_id_li
AND sede_new IS NULL
AND dt_inizio < m.succ_dt_inizio;
END LOOP;
IF n = 100
THEN
COMMIT;
n := 0;
END IF;
END LOOP;
COMMIT;
END;
nel primo cursore prendo i row:id della tabella in questione , che è la copia della tabella del cursore implicito che ha la descrizione delle sedi e delle date di inizio e fine ,la descrizione non è sempre presente ed io devo aggiornarla valorizzandola nelle righe successive a null con il valore dell'ultima descrizione presente , siccome che in un row_id ci possono essere più descrizioni ho fatto l'aggiornamento per ogni row_id valorizzando la descrizione dove è null < dt_inizio_succ fatto con la funzione lag nella tabella curs_table cosi quando scorre il cursore aggiorna per la dt_inizio dell' ultima descrizione valida non a null e la dt_inizio della seconda descrizione valida non a null e cosi via il problema e che la procedura è un po lenta qualcuno saprebbe dirmi un approccio più veloce per la procedura in questione .
Non so se sono stato abbastanza chiaro , comunque grazie in anticipo per un eventuale risposta .
Saluti Vittorio
17 Settembre 2015
da
VTABEL74