Esempio: Importa dati tra tabelle
La procedura sposta dati da una tabella sorgente, presente su altro db, ad una di destinazione facendo attenzione che non ci siano dati duplicati.
CREATE OR REPLACE PROCEDURE importa_soggetto_da_tabella IS
n_read NUMBER;
n_add NUMBER;
v_error_code NUMBER;
v_error_msg VARCHAR2(512);
rowcount NUMBER;
var NUMBER;
-- il cursore punta a tutte le tuple della tabella di partenza non ancora presenti in quella di destinazione.
CURSOR cur1 IS
SELECT TRIM(ID_soggetto) as sogg, c_SOGGETTO, c_tipo_uff, c_ufficio
FROM SOGGETTO_PART@DB_SOGGETTO --dblink: la tabella SOGGETTO_PART è su un alto db
WHERE C_SERVIZIO = 'WEB'
AND (C_ID_soggetto like 'A%' OR C_ID_soggetto like 'B%')
minus
SELECT TRIM(SA_soggetto) , trim(to_char(SA_CODICE_SOGGETTO,'00000')) as COD_SOGGETTO, SA_TIPO_UFF, SA_UFFICIO
FROM SOGGETTO_DEST
WHERE SA_soggetto like 'E%' OR SA_soggetto like 'X%';
BEGIN
n_read := 0;
n_add := 0;
FOR rec IN cur1 LOOP
n_read := n_read+1;
SELECT COUNT(*) into rowcount
FROM SOGGETTO_DEST
WHERE SA_soggetto = rec.sogg
AND SA_CODICE_SOGGETTO = rec.c_SOGGETTO
AND SA_TIPO_UFF = rec.c_tipo_uff
AND SA_UFFICIO = rec.c_ufficio;
IF rowcount = 0 THEN
var := 1;
WHILE var < 8 LOOP
INSERT INTO SOGGETTO_DEST (SA_soggetto, SA_CODICE_SOGGETTO, SA_TIPO_UFF, SA_UFFICIO, SA_CODICE_FUNZIONE, SA_ABILITATO)
VALUES (rec.sogg, rec.c_SOGGETTO, rec.c_tipo_uff, rec.c_ufficio, var, 1);
n_add := n_add+1;
var := var + 1;
END LOOP;
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS THEN BEGIN
v_error_code := SQLCODE;
v_error_msg := SQLERRM;
IF cur1%ISOPEN THEN CLOSE cur1;
END IF;
raise_application_error(-20001,'mdr4_import_soggetto_from_geu-ERRORE - '||SQLCODE||' -ERROR- '||SQLERRM);
END;
END importa_soggetto_da_tabella;