Oracle Lessons

Oracle Tipi Dati Astratti Lezione 7


Array Variabili.Un Array Variabile consente di memorizzare attributi ripetuti di un record in un’unica riga. Per esempio si supponga di voler tener traccia degli attrezzi presi in prestito dai propri vicini. Possiamo definire la tabella PRESTITO:create table PRESTITO(Nome varchar(25),NomeAttrezzo varchar(25),constraint PRESTITO_PK primary key (Nome, Attrezzo));Anche se il valore del campo NOME, che rappresenta il nome del vicino, non cambia, viene ripetuto in ogni record in quanto fa parte della chiave primaria.I Collettori come gli Array Variabili consentono di ripetere solo i valori di colonna che cambiano, permettendo un potenziale risparmio di spazio sul disco.I Collettori possono essere utilizzati per rappresentare in modo accurato le relazioni tra i tipi di dati negli oggetti del database.  Creazione di un Array VariabileUn Array Variabile può essere creato basandosi sia su un tipo di dati astratto, sia su uno dei tipi di dati standard di Oracle. Per esempio si potrebbe creare un nuovo tipo di dati, ATTREZZO_TY che possiede una solo colonna.   Osservazione.E’ opportuno limitare gli Array Variabili ad una solo colonna, per utilizzare più colonne si prenda in considerazione la possibilità di utilizzare le Tabelle Nidificate.Create type ATTREZZO_TY as object(NomeAttrezzo varchar(25));Per creare un Array Variabile (cui verrà assegnato il nome ATTREZZI_VA), non è necessario creare prima il tipo base, in questo caso ATTREZZO_TY. Dato che l’array variabile si basa su un’unica colonna, è possibile creare il tipo ATTREZZI_VA in un unico passaggio. Per creare l’Array Variabile si utilizza la clausola as varray() del comando create type:create or replace type ATTREZZI_VA as varray(5) of varchar2(25);Quando si esegue questo commando, viene creato un tipo di nome ATTREZZI_VA. La clausola as varray(5) comunica a Oracle la creazione di un array variabile contenente un massimo di cinque voci per record.Con questo tipo di dati è possibile ridefinire la tabella PRESTITO: create table PRESTITO(Nome varchar(25),Attrezzi ATTREZZI_VA,constraint PRESTITO_PK primary key (Nome, Attrezzo));  Descrizione dell’ Array Variabile.La tabella PRESTITO contiene un record per ciascuna persona che prende in prestito degli attrezzi, anche se questa persona ha in prestito più attrezzi. Una desc sulla tabella restituisce:Name Null? Type------------------ -------------- ----------------------NOME NOT NULL VARCHAR2(25)ATTREZZI ATTREZZI_VAPossiamo lanciare anche una select sulla tabella USER_TYPES :select TypeCode,AttributesFrom USER_TYPESWhere Type_Name = ‘ATTREZZI_VA’;e vengono restituite informazioni sul tipo (in questo caso il TypeCode è COLLECTION) oppure sulla tabella USER_COLL_TYPES che restituisce informazioni più dettagliate sui tipi.  Inserimento di un record nell’ Array Variabile.Per inserire un record in tabelle che utilizzano Array Variabili è necessario ricorrere ai Constructor Method. I Constructor method possono essere nidificati se siamo in presenza di tipi di dato astratto definiti in termini di altri tipi di dato astratto. Il comando seguente inserisce un singolo record nella tabella PRESTITO:insert into PRESTITO values(‘…’,ATTREZZI_VA(‘..’,’..’,’..’));Questo comando di insert specifica subito il valore per la colonna Nome , dal momento che questa colonna non fa parte di alcun tipo di dati astratto viene popolata nel modo classico.La parte successiva del comando insert inserisce dei record nella colonna Attrezzi. Dato che questa utilizza l’array variabile Attrezzi_VA, è necessario utilizzare il Constructor method ATTREZZI_VA. Inoltre, dato che si tratta di un Array variabile, è possibile passare più valori al Constructor Method stesso. Se l’Array Variabile si fosse basato sul tipo di dati ATTREZZO_TY, le chiamate al tipo di dati ATTREZZO_TY sarebbero state nidificate all’interno delle chiamate a ATTREZZI_VA:insert into PRESTITO values(‘…’,ATTREZZO_VA( ATTREZZO_TY(‘….’),ATTREZZO_TY(‘….’),ATTREZZO_TY(‘….’)));L’array variabile ATTREZZI_VA è stato definito in modo da avere sino a cinque valori. Nel comando di insert precedente sono stati inseriti solo tre valori, gli altri due rimangono così non inizializzati. Se si desidera impostare i valori non inizializzati a null è sufficiente specificarlo nel comando di insert:insert into PRESTITO values(‘…’,ATTREZZO_VA( ‘…’, ‘…’,’…’,null,null));Nota.Non è possibile inserire dei record in una tabella che contiene un Array Variabile, a meno di non conoscere la struttura e tipi di dati all’interno dell’array.  Interrogazione di dati dagli Array Variabile. L’interrogazione dei dati dagli array variabili può avvenire direttamente dalla tabella: select Attrezzi from Prestito; ATTREZZI------------------------------------------------------------------------------------ATTREZZI_VA(‘…’,’…’,’…’) Per visualizzare i dati degli array variabili su righe separate, si può ricorrere alla funzione TABLE nella clausola from. Select b.Nome, n.*From PRESTITO b, TABLE(b.ATTREZZI) n; Name Column_Name---------------------------------- --------------------------------------------Rob MARTELLORob MAZZARob ASCIA  La funzione TABLE() accetta come imput il nome dell’array variabile mentre all’output viene assegnato l’alias N. Vengono selezionati i valori in N, creando così la seconda colonna dell’output.Inoltre è possibile eseguire una query sull’array variabile per stabilirne il numero massimo di voci per riga, chiamato LIMIT(), e il numero corrente di voci per riga, COUNT().  Ad esempio: set server output ondeclarecursor prestito_cursor isselect * from PRESTITO;beginfor prestito_rec in prestito_cursorloopdbms_output.put_line(‘Nome Contratto:’ || prestito_rec.Nome);for i in 1 .. prestito_rec.Attrezzi.Countloopdbms_output.put_line(prestito_rec.Attrezzi(i));end loop;end;/ Nota.E’ possibile utilizzare la clausola modify limit del comando alter type per cambiare il numero massimo di voci consentite in un array variabile.Per una maggiore flessibilità nella selezione di dati dai collettori, è consigliato l’uso di tabelle nidificate.