La gestione dei tipi di dati in Oracle e' molto potente ma presenta alcuni elementi complessi. Si ritiene pertanto utile fornire qualche indicazione su tale argomento.
Per motivi di brevita' e chiarezza vengono riportati nel seguito solo alcuni elementi e ci si restringe nell'analisi alle sole versioni piu' recenti.
Per la memorizzazione dei dati, Oracle utilizza un insieme di datatype (NUMBER, CHAR, VARCHAR2, DATE, RAW, LONG, LONG RAW) che sono stati scelti per ottenere la massima efficienza nella memorizzazione e nel reperimento dei dati
La scelta sui tipi di dato da utilizzare e' effettuata da chi disegna la base dati. Per saper il tipo di dati utilizzato per le colonne di una tabella e' possibile, da SQL*Plus, utilizzare il comando DESCR.
Quale esempio riportiamo alcuni elementi relativi ad alcuni internal datatype:
VARCHAR2
Il tipo di dato VARCHAR2 memorizza una stringa di lunghezza inferiore ai 2000 caratteri. Questo tipo di dato memorizza i dati in formato variabile e quindi memorizza solo i dati effettivamente con notevoli risparmio in spazio e tempo di accesso.
E' utilizzato per la memorizzazione di stringhe.
CHAR
Il tipo di dato CHAR memorizza una stringa di lunghezza inferiore ai 255 caratteri. Questo tipo di dato memorizza i dati in formato fisso e quindi utilizza comunque l'intera lunghezza definita.
E' utile per stringhe di caratteri di breve lunghezza o lunghezza costante.
Per l'utilizzo dei dati relazionali da parte di linguaggi di 3a generazione i precompilatori Pro* (Cobol, C, ..) Oracle consentono la definizione di host-variables che sono variabili utilizzabili sia negli statement SQL che nelle istruzioni del linguaggio ospite.
I datatype external definiscono la modalita' di gestione dei dati da parte di Oracle. I datatype external possibili sono i segenti: varchar2, number, integer, float, string, varnum, decimal, long, varchar, rowid, date, varraw, raw, long raw, unsigned, display, long varchar, long varraw, char, charz, mslabel.
Ciascun datatype external ha una sua gestione ampiamente descritta dai manuali. Quale esempio riportiamo alcuni elementi relativi ad alcuni external datatype:
VARCHAR2
Il tipo di dato VARCHAR2 effettua il blank striping in coda alle variabili. Quindi non memorizza blank in fondo ai dati. Nel caso in stringa contenente soli blank viene posto un valore NULL. E' compito del programmatore l'eventuale riempimento a blank delle variabili.
VARCHAR
Il tipo di dato VARCHAR e' composto da due campi contenti la lunghezza ed i dati effettivi. E' compito del programmatore la corretta impostazione della lunghezza.
CHAR
Il tipo di dato CHAR non effettua il blank striping in coda alle variabili. Quindi memorizza blank in fondo ai dati. Nel caso in stringa contenente soli blank viene posto un valore con tutti blank. E' compito del programmatore sincronizzare le lunghezze delle variabili quando inserite o confrontate.
STRING
Il tipo di dato STRING ha un comportamento simile al VARCHAR ma utilizza stringhe null terminate.
I datatype external sono assolutamente distinti e non legati ai datatype internal. Pertanto una colonna CHAR (quindi datatype internal CHAR) puo' essere letta in una host variable da linguaggio compilato utilizzando external variables VARCHAR2, VARCHAR, CHAR, STRING, CHARZ, .. Analogamente avviene per gli altri datatype internal.
La scelta del datatype piu' comodo per la programmazione e' del programmatore stesso il quale deve definire in maniera corretta le variabili ed utilizzarle coerentemente. Una particolare attenzione deve essere posta alle conversioni automatiche che avvengono negli statement SQL che possono variare il comportamento dell'ottimizzatore.
Le definizioni di default del precompilatore coprono tutte le normali esigenze di definizione; nel caso di trattamenti particolari di valori, dati particolare, .. e' invece necessario definire tipi di dati differenti.
I tipi di dato dei singoli linguaggi di programmazione varia a seconda dei linguaggi e delle implementazioni. Semplici esempi sono il PIC X(n) in Cobol o il char in C-language.
Questi dipendono naturamente dal linguaggio di programmazione utilizzato.
PRO*C
Il PRO*C e' un precompilatore d'elezione per la realizzazione di programmi verso Oracle. Fornisce infatti un numero maggiore di datatype ed alcuni moduli debbono essere necessariamente essere realizzati in C (tra questi i richiami esterni ai Forms, ...).
PRO*Cobol
Il PRO*Cobol e' un precompilatore che consente l'embedding di comandi SQL in programmi Cobol.
Il PRO*Cobol ha una serie di default nel trattamento dei dati:
tutte le variabili definite come PIC X(n) sono implicitamente di tipo VARCHAR2 (ovviamente external)
tutte le variabili definite come PIC X(n) VARYING sono implicitamente di tipo VARCHAR
tutte le variabili possono essere definite con un tipo differente utilizzando lo statement EXEC VAR host_var IS type
se si utilizza il parametro MODE=ANSI tutte le variabili PIC X(n) sono di tipo CHAR [che non e' il default]
....
Il PRO*Cobol "esplode" gli statement SQL contenuti nei programmi Cobol nelle chiamate corrette alle librerie di Oracle. Nel caso di passaggio di dati tra variabili Cobol e database Oracle vengono effettuate tutte operazioni di conversione descritte per i datatype external.
Trattamento dei NULL values
Si ricorda che per il trattamento dei NULL values sono disponibili specifiche funzioni SQL (NVL(X,Y), IS NULL, ..).
Quando si utilizzano valori che possono essere NULL o che possono venire troncati e' opportuna la definizione di indicator variables.
Il trattamento dei valori nulli e' variato nel tempo a secondo della versione del precompilatore e della modalita' di compilazione utilizzata.
Il comportamento del programma finale e' pesantemente influenzato dalla versione di precompilatore e dalle opzioni utilizzate. Le differenze riguardano il trattamento dei dati, le conversioni, le funzionalita' aggiuntive, le segnalazioni d'errore ed i warning generati.
E' opportuno fare riferimento ai manuali specifici sull'argomento.
Testo: Utilizzo di differenti tipi
di dati Oracle con i precompilatori
Data: 7 Febbraio 1997
Autore: mail@meo.bogliolo.name