sabato 25 giugno 2011

Modificare una colonna in DB2

Per modificare il tipo di una colonna di una tabella DB2 si può usare il comando ALTER TABLE con l'opzione ALTER COLUMN:


ALTER TABLE <nome_schema>.<nome_tabella> ALTER COLUMN <nome_colonna> SET DATA TYPE VARCHAR(50);


Esempio:
ALTER TABLE CATALOGO.MUSICA ALTER COLUMN TITOLO SET DATA TYPE VARCHAR(200);


Non è sempre possibile cambiare il tipo di dato di una colonna già esistente.
Ad esempio NON è possibile:

  • Ridurre la lunghezza di un VARCHAR
  • trasformare un CHAR in un VARCHAR

Esportare e importare dati da una tabella DB2


Ci sono 2 formati per esportare/importare i dati da una tabella:

  • formato .del (i dati esportati vengono delimitati da virgole. Questo tipo di formato può essereletto indipendentemente dal sistema che si usa)
  • formato. ixf (è un formato che può essere letto solo da DB2, oltre ai dati memorizza anche la struttura della tabella)

Export di tutti i dati di una tabella in formato del:

export to <nome_file>.del of del 
select * from <nome_schema>.<nome_tabella_origine>;

oppure, per esportare i dati sostituendo una colonna con dei dati inseriti manualmente (ad esempio esportare i dati con la stringa "abc" al posto della colonna2):

export to <nome_file>.del of del
select
COLONNA1,
'abc',
COLONNA3
from <nome_schema>.<nome_tabella_origine>;

Import di tutti i dati in una tabella:
import from <nome_file>.del of del 
commitcount 5000 INSERT INTO <nome_schema>.<nome_tabella_destinazione>;

La import può inserire i dati nella tabella di destinazione in diversi modi:
  • INSERT, aggiunge i record letti dal file .del in fondo alla tabella senza sovrascrivere eventuali datigià presenti
  • INSERT_UPDATE, inserisce i nuovi record letti dal file aggiornando eventuali dati già inseriti 
  • REPLACE, svuota la tabella e inserisce i nuovi dati

Nota: E' importante specificare l'opzione commitcount <nr_record> per import di grandi volumi di dati per evitare che l'import fallisca a causa di un errore TRANSACTION LOG FULL.
Specificando il commitcount, il log viene svuotato ogni volta che sono stati inseriti un numero di record pari al valore specificato per l'opzione.

Export e import in formato .ixf:

export to <nome_file>.ixf of ixf select * from <nome_schema>.<nome_tabella_origine>;

import from <nome_file>.ixf of ixf
commitcount 5000 INSERT INTO <nome_schema>.<nome_tabella_destinazione>;

Aggiungere una colonna a una tabella DB2

Come inserire una colonna:

ALTER TABLE <schema_tabella>.<nome_tabella> ADD COLUMN <nome_colonna> <datatype>;
Esempio 1:
ALTER TABLE CATALOGO.MUSICA ADD COLUMN AUTORE VARCHAR(60);
Esempio 2:
ALTER TABLE CATALOGO.MUSICA ADD COLUMN ID CHAR(3) NOT NULL;
Esempio 3:
ALTER TABLE CATALOGO.MUSICA ADD COLUMN PREZZO_DISCO DECIMAL(5,2) ;

NOTA: E' possibile inserire colonne solo alla fine della tabella.
Se serve inserire una colonna in mezzo alle altre, è necessario creare una nuova tabella (mantenendo temporaneamente quella originaria) e ricreare la struttura della nuova tabella da zero inserendo anche la colonna aggiuntiva.

Posso fare in 2 modi:
1. Per inserire i dati nella tabella nuova (con la colonna in più), bisogna fare una INSERT di tutti i dati che si trovavano nella tabella di partenza. Ad esempio la insert inserisce in MUSICA2 i dati di MUSICA1, portandosi dietro anche i valori null e lasciando a null i valori relativi alla nuova colonna.


INSERT INTO CATALOGO.MUSICA2 (AUTORE,NOME_ALBUM,ANNO,PREZZO) (
select AUTORE,NOME_ALBUM,ANNO, PREZZO 
        from CATALOGO.MUSICA);

A questo punto si può eliminare la tabella originaria che ha una colonna in meno.


2. Altrimenti si può creare una nuova tabella con la colonna desiderata.
Faccio la export dei dati e della struttura della tabella, ma nella select metto anche la colonna (vuota) nella posizione in cui l'ho inserita nella create. A questo punto faccio la import sulla tabella.
Creo la nuova tabella con una colonna in più:
CREATE TABLE CATALOGO.MUSICA3  (
 AUTORE CHAR(50) NOT NULL ,
 TITOLO CHAR(50),
 NOME_ALBUM CHAR(50) NOT NULL ,
 ANNO INTEGER NOT NULL ,
 ETICHETTA CHAR(50) )
 IN USERSPACE1;

Faccio la export dei dati della tabella originale impostando il secondo campo come una stringa vuota (nella tabella originale infatti il secondo campo non esiste):
export to musica.ixf OF IXF select AUTORE, '', NOME_ALBUM, ANNO, ETICHETTA FROM CATALOGO.MUSICA;

Faccio la import dei dati esportati nella tabella nuova.
import from musica.ixf OF IXF insert into CATALOGO.MUSICA3;

Per esportare_importare i dati posso anche usare il formato .del invece del formato .ixf. La differenza tra i due metodi sta nel fatto che al momento dell'import, nella tabella la nuova colonna creata avrà dei valori NULL con la IXF, mentre avrà dei valori vuoti con la DEL.

Export/import in formato .del:
export to musica.del OF DEL select AUTORE, '', NOME_ALBUM, ANNO, ETICHETTA FROM CATALOGO.MUSICA;

import from musica.del OF DEL insert into CATALOGO.MUSICA3;

venerdì 24 giugno 2011

Creare un database DB2

Versione DB2 8
Nella versione DB2 8.x si può dare una create come questa:

db2 create db <nome_database> on <db_path>


Esempio:
db2 create db DB_PROVA on /db2path




crea il db DB_PROVA nella directory /db2path. 
In questa directory sarà creato l'intero database (sia i container che i file di controllo interni del DB)



Versione DB2 9
Nella versione 9 è attiva di default l'opzione AUTOMATIC STORAGE, per cui è possibile dare una create come questa, specificando più path:

db2 create db <nome_database> on '<db_path1>' dbpath on '<db_path2>'


Esempio:
db2 create db DB_PROVA on '/db2path/db2data' dbpath on '/db2path'

In questo modo il database DB_PROVA viene creato così:
/db2path: contiene il database ed i file di controllo interni
/db2path/db2data: crea i container che andranno a contenere i dati veri e propri del database