Convertire una colonna da Varchar2 a CLOB e conservare i dati esistenti
Il campo NOTE (attualmente è Varchar2) della tabella T2317 deve diventare di tipo CLOB mantenendo i valori esistenti.
Di seguito alcune soluzioni:
1) aggiungere colonna CLOB, fare update della colonna con i valori della colonna precedente in varchar2 e successivamente eliminare colonna varchar2 e rinominare nome colonna clob al nome originale.
2) creazione della tabella con nuovo nome e il campo aggiornato e fare insert as a select ( o utilizzare conversione to_clob ).
3) export e import dei dati nella nuova tabella
1) aggiungere colonna CLOB, fare update della colonna con i valori della colonna precedente in varchar2 e successivamente eliminare colonna varchar2 e rinominare nome colonna clob al nome originale.
2) creazione della tabella con nuovo nome e il campo aggiornato e fare insert as a select ( o utilizzare conversione to_clob ).
3) export e import dei dati nella nuova tabella
Caso 1
Nel mio esempio si tratta di un db versione 9.
-- backup tabella
exp \"sys/xxxxx as sysdba\" TABLES=(.T2317R) file=exp_T2317R.dmp log=exp_T2317R.log consistent=y
Possiamo seguire due strade
Opzione 1
Inserimento della nuova colonna alla fine della tabella
-- aggiungere colonna CLOB,
ALTER TABLE T2317R ADD (appo CLOB);
-- fare update della colonna con i valori della colonna precedente in varchar2
UPDATE T2317R SET appo = NOTE;
-- successivamente eliminare colonna varchar2
ALTER TABLE T2317R DROP COLUMN NOTE;
--rinominare nome colonna clob al nome originale.
ALTER TABLE T2317R rename column appo to NOTE;
Opzione 2
La nuova colonna Clob conserverà la posizione della colonna originaria
ALTER TABLE T2317R ADD NOTE_COPY VARCHAR2 (4000 Byte)
UPDATE T2317R SET NOTE_COPY = NOTE;
commit;
UPDATE T2317R SET NOTE = NULL;
commit;
ALTER TABLE T2317R MODIFY NOTE LONG;
---
ALTER TABLE T2317R MODIFY NOTE CLOB;
UPDATE T2317R SET NOTE = NOTE_COPY ;
commit;
ALTER TABLE T2317R DROP COLUMN NOTE_COPY ;
Occorre ricostruire gli indici relativi alla colonna aggiornata.
ALTER INDEX <nome indice> REBUILD;