Oracle Lessons

Lezioni Pratiche in Italiano

Creato da Pietro_Bonfigli il 11/03/2009

Area personale

 

Tag

 

Archivio messaggi

 
 << Luglio 2024 >> 
 
LuMaMeGiVeSaDo
 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
 
 

Cerca in questo Blog

  Trova
 

FACEBOOK

 
 

Ultime visite al Blog

marcop1973pixfaxhellingen666RiukaTerzo_Blog.GiusFDMDMFqwerty_alnicola.cambaraFilippoPaganellifrancocapoluanadiciommoaleale78alebherryraffaelesoldanoio_brina
 

Chi puņ scrivere sul blog

Solo l'autore puņ pubblicare messaggi in questo Blog e tutti gli utenti registrati possono pubblicare commenti.
 
RSS (Really simple syndication) Feed Atom
 
 

 

Oracle Tipi Dati Astratti Lezione 6

Post n°32 pubblicato il 18 Agosto 2010 da Pietro_Bonfigli
 

  Metodi.

Per la creazione di una vista ad oggetto sulla tabella cliente sono stati definiti tipi di dato astratti utilizzati dalla tabella stessa. Questi tipi di dato aiutano a standardizzare la rappresentazione dei dati, ma hanno anche un altro scopo:

E‘ possibile definire metodi che si applichino ai tipi di dato.

Si consideri la Object View CLIENTE_OV:

create view CLIENTE_OV (Cliente_ID, Persona) as

select Cliente_ID,

PERSONA_TY(Nome,INDIRIZZO_TY(Via, Citta, Prov, Cap))

From CLIENTE. 

Questa vista applica i tipi di dato astratti PERSONA_TY, INDIRIZZO_TY, ai dati contenuti nella tabella CLIENTE. Se questi tipi di dato sono associati a dei metodi, questi potranno essere applicati ai dati della tabella.

Per la creazione dei metodi occorre utilizzare il comando create type body.

Prima di creare il corpo di un metodo, occorre assegnare a quest’ultimo un nome all’interno della dichiarazione del tipo di dati.

Vediamo ad esempio la seguente definizione di ANIMALI_TY:

create or replace type ANIMALE_TY as object

(Generazione varchar2(25),

Nome varchar2(25),

DataNascita date,

member function ETA(DataNascita in date) return number);

la linea:

member function ETA(DataNascita in date) return number

assegna un nome alla funzione che rappresenta un membro del tipo di dati ANIMALE_TY. Per definire la funzione ETA, occorre utilizzare il comando create type body, tale funzione restituirà l’età degli animali in giorni:

create or replace type body ANIMALE_TY as

member function Eta (DataNascita DATE) return number is

begin

return(Sysdate - DataNascita);

end;

Per codificare altre funzioni o procedure, è necessario specificarle all’interno dello stesso comando create type body, prima della clausola finale end.

Una qualunque tabella che utilizzi questo tipo di dati, sarà in grado di utilizzare la funzione ETA.

Nota.

Non è possibile eliminare o ricreare un tipo di dati astratto attualmente utilizzato nella definizione di una Table.

Vediamo un esempio di utilizzo del metodo ETA:

supponiamo di avere una tabella così definita

create table ANIMALE

(ID number,

Animale ANIMALE_TY);

Per utilizzare il metodo ETA in una select dobbiamo utilizzare la seguente sintassi:

select A.Animale.ETA(A.Animale.DataNascita)

from ANIMALE A;

Come accade con gli attributi di un tipo di dato astratto, è possibile fare riferimento ai metodi membro tramite i nomi delle colonne che utilizzano i tipi di dato (in questo caso ANIMALE.ETA). La chiamata al metodo ETA la esegue all’interno del tipo di dati ANIMALE_TY. Di conseguenza questo permette la memorizzazione all’interno del database di informazioni derivate che dipendono anche dal momento temporale di riferimento.

Osservazione.

L’informazione restituita dai metodi di un tipo di dati astratto, è memorizzata nella base di dati e dipende dall’istante temporale nella quale vien richiesta.

Gestione dei Metodi.

E’ possibile aggiungere nuovi metodi a un tipo di dati modificando il tipo di dati stesso (mediante il comando alter type). Per modificare il tipo di dati occorre elencare tutti i suoi metodi, sia vecchi che nuovi, la nuova struttura così verrà memorizzata al posto della vecchia. Completata la modifica del tipo di dati, occorre modificarne il corpo, elencando tutti i metodi del tipo di dati in un unico comando. Non è necessario concedere il privilegio EXECUTE sulle funzioni membro e sulle procedure dei tipi di dato astratti, infatti basta concederlo solo sul tipo di dati ed automaticamente questo utente disporra del privilegio EXECUTE sui metodi che fanno parte del tipo di dati.

Quando si creano funzioni membro, è possibile definirli come metodi mappa o metodi ordine (o non utilizzare nessuna delle due definizioni, come per la funzione ETA di ANIMALE_TY).

Metodo Mappa.

Restituisce la posizione relativa di un determinato record nell’ordinamento di tutti i record all’interno dell’oggetto. Il corpo di un tipo può contenere solo un metodo mappa, che deve essere una funzione.

Metodo Ordine.

E’ una funzione membro che accetta un record dell’oggetto come argomento esplicito e restituisce un valore intero. A seconda se il valore restituito è negativo, zero o positivo, l’argomento “implicito” autonomo della funzione è rispettivamente minore, uguale, o maggiore del valore del record specificato esplicitamente. Quando all’interno di un’Oggetto vengono confrontate più righe in una clausola order by , il metodo ordine viene eseguito automaticamente per ordinare le righe restituite. La specifica del tipo di dati deve contenere un solo metodo ordine, che deve essere una funzione con tipo di restituzione INTEGER.

 
 
 

Oracle Tipi Dati Astratti Lezione 5

Post n°31 pubblicato il 18 Agosto 2010 da Pietro_Bonfigli
 

 Manipolazione dei dati mediante Object View.

I dati nella tabella CLIENTE possono essere aggiornati tramite la Object View CLIENTE_OV, oppure aggiornando direttamente la tabella CLIENTE nel modo tradizionale.

Se si vuole utilizzare la Object View occorre far uso dei Constructor Method dei tipi istanziati specificando il loro nome nel comando insert:

 

insert into CLIENTE_OV

values (… , PERSONA_TY(‘..’, INDIRIZZO_TY(‘…’,’…’,’…’,…)));

 

Dato che si possono utilizzare entrambi i metodi per inserire i valori nella Object View, è possibile standardizzare il modo in cui l’applicazione manipola i dati. Se le operazioni di inserimento si basano tutte su tipi di dato astratti, si potrà utilizzare lo stesso tipo di codice, indipendentemente che dal fatto che i tipi di dato astratti siano stati creati prima o dopo la tabella.

Uso dei Trigger INSTEAD OF.

Se viene create una Object View, è possibile utilizzare i trigger INSTEAD OF per indicare a Oracle come aggiornare le tabelle di base che fanno parte della vista. Questi trigger si applicano sia a Object Views, sia a viste relazionali convenzionali.

Per esempio se una vista comporta un join di due tabelle, la possibilità di aggiornare i record nella vista è limitata. Tuttavia se si usa un trigger INSTEAD OF, è possibile indicare a Oracle come aggiornare , cancellare o inserire i record nelle tabelle nel caso in cui un utente cerchi di modificare i valori tramite una vista.

Il codice contenuto nel trigger INSTEAD OF viene eseguito al posto del comando insert, update o delete.

 

Vediamo il seguente esempio:

Supponiamo di avere una vista che unisce tramite join la tabella BIBLIOTECA alla tabella BIBLIOTECA_AUTORE:

 

create or replace view AUTORE_EDITORE as

select BA.NOMEAutore.TITOLO, B.Editore

from BIBLIOTECA_AUTORE BA inner join BIBLIOTECA B

using (Titolo);

 

E’ possibile selezionare dei valori da questa vista e manipolare i dati mediante la vista stessa con i trigger INSTEAD OF.

 

Si considerino i seguenti record:

 

select * from AUTORE_EDITORE

where Nome_Autore = ‘PIPPO’;

 

NOME_AUTORE EDITORE

-------------------------- ----------------------------

PIPPO’ ‘PLUTO’

Se si cerca di aggiornare il valore del campo ‘Editore’ con la seguente update, Oracle restituisce un errore:

 update AUTORE_EDITORE

set Editore = ‘Tizio’

where Nome Autore = ‘PIPPO’;

 

ora-01720: cannot modify a column wich maps to a non key-preserved table;

 

Il problema è che Oracle non è in grado di stabilire quale editore di quale record aggiornare nella tabella BIBLIOTECA.

 

Se associata alla view viene creato un trigger INSTEAD OF fatto così:

 

create or replace trigger AUTORE_EDITORE_UPDATE

instead of UPDATE on AUTORE_EDITORE

for each row

begin

if :old.Editore <> :new.Editore

then

update BIBLOTECA

set Editore = :new.Editore

where Titolo = :old.Titolo;

end if;

if :old.NomeAutore <> :new.NomeEditore

then

update BIBLOTECA_AUTORE

set NomeAutore = :new.NomeEditore

where NomeAutore = :old.NomeAutore;

end if;

end;

 

Nella testate del trigger si descrive il suo uso tramite la clausola instead of. Il trigger serve a supportare i comandi di update eseguiti sulla vista AUTORE_EDITORE. Si tratta di un trigger a livello di riga; ogni riga modificata viene elaborata come definito dal corpo.

Il corpo del trigger specifica a Oracle come eseguire l’aggiornamento. Il primo controllo si concentra sul valore della colonna Editore:

Se il vecchio valore è diverso da nuovo allora vengono aggiornati i record della tabella BIBLIOTECA. Stesso discorso per la tabella BIBLIOTECA_AUTORE nei confronti della colonna NomeAutore.

Pertanto ogni aggiornamento della vista consente di aggiornare nessuna o entrambe le tabelle. Il trigger INSTEAD OF ideato per supportare le viste ad oggetto, rappresenta uno strumento potente per lo sviluppo di applicazioni.

 
 
 

Oracle Tipi Dati Astratti Lezione 4

Post n°30 pubblicato il 16 Agosto 2010 da Pietro_Bonfigli
 

 Implementazione di Viste Oggetto.

Supponiamo di essere in possesso di un database relazionale classico e di volerlo riorganizzare logicamente secondo lo schema Object Oriented. In questo caso l’operazione da fare è quella di riuscire a sovrapporre strutture orientate agli oggetti, come i tipi di dato astratti, su tabelle relazionali esistenti già esistenti. Oracle mette a disposizione delle Object View per la definizione di oggetti su tabelle relazionali già esistenti.

Nota

In tutti gli esempi successivi, i nomi delle Object View termineranno sempre con il suffisso “OV”.

Supponiamo che nella nostra base di dati sia presente la seguente tabella CLIENTE:

create table CLIENTE

(Cliente_ID number primary key,

Nome varchar2(25),

Via varchar2(50),

Citta varchar2(25),

Prov varchar2(2),

Cap number);

 

Riprendiamo i nostri due tipi di dato astratti:

create type IDIRIZZO_TY as object

( Via varchar2(50),

Città varchar2(25),

Provincia varchar2(2),

CAP number

);

create type PERSONA_TY as object

(Nome varchar2(25),

Indirizzo INDIRIZZO_TY

);

che devono essere perfettamente coincidenti con tutti o parte delle colonne della tabella CLIENTE.

A questo punto è possibile creare una Object View sulla tabella CLIENTE, utilizzando i tipi di dato definiti:

create view CLIENTE_OV (Cliente_ID, Persona) as

select Cliente_ID,

PERSONA_TY(Nome,INDIRIZZO_TY(Via, Citta, Prov, Cap))

From CLIENTE.

Una Object View la si crea con il comando Create View, al suo interno occorre specificare la query che costituirà la base della Object View.

Si analizzi in dettaglio questo comando:

Nella prima linea si assegna un nome alla Object View:

create view CLIENTE_OV (Cliente_ID, Persona) as

la vista in questione è composta da due colonne:

Cliente_ID e Persona;

Persona è definita come tipo PERSONA_TY; nella sezione successiva del comando viene definita la query che formerà la base della vista:

select Cliente_ID,

PERSONA_TY(Nome,INDIRIZZO_TY(Via, Citta, Prov, Cap))

From CLIENTE.

Dove le colonne della tabella cliente vengono raggruppate utilizzando i tipi definiti.

Questo esempio mostra alcuni utilizzi interessanti della sintassi: quando si crea una tabella su tipi di dato astratti già esistenti, i valori delle colonne vengono selezionati dalla tabella facendo riferimento ai nomi delle colonne invece che ai loro Constructor Method; invece per la creazione di una Object View occorre fare riferimento ai nomi dei Constructor Method (Persona_TY, INDIRIZZO_TY).

Inoltre nella query è anche possibile utilizzare una clausola where che limita la visualizzazione dei CLIENTI.

Quando si crea una Object View, la clausola where della query di base non fa riferimento al tipo di dati astratto. La clausola where fa riferimento direttamente alle colonne della tabella perché la tabella in questione non si basa su tipi di dato astratti.

Vantaggi sull’uso di Object View.

L’uso di Object View presenta alcuni vantaggi:

  • Consentono di creare tipi di dati astratti capaci di operare su tabelle già esistenti; dato che si possono utilizzare gli stessi tipi di dato in più tabelle dell’applicazione, si potrà migliorare l’aderenza dell’applicazione alla rappresentazione standard dei dati e la capacità di riutilizzare gli oggetti già esistenti;

  • Dal momento che si possono definire metodi per i tipi di dato astratti, questi verranno applicati sia ai dati contenuti nelle nuove tabelle, sia ai dati delle tabelle preesistenti.

  • Le Object View offrono due modi diversi per inserire i dati nella tabella base. Le flessibilità nella manipolazione dei dati per tali viste, ossia la possibilità di trattare la tabella base sia come tabella relazionale, che coma tabella ad oggetto, rappresenta un vantaggio significativo per gli sviluppatori di applicazioni.

 
 
 

Oracle Tipi Dati Astratti Lezione 3

Post n°29 pubblicato il 16 Agosto 2010 da Pietro_Bonfigli
 

 

Riprendiamo la nostra tabella CLIENTI, essa è composta da una colonna di tipo semplice e da una colonna strutturata:

 

create table CLIENTI

(Cliente_id number,

Persona PERSONA_TY

);

 

Dove il tipo PERSONA_TY è strutturato nel seguente modo:

 

create type PERSONA_TY as object

(Nome varchar2(…),

Indirizzo UTE1.INDIRIZZO_TY

);

 

Gli attributi del tipo di dati vengono completamente qualificati quando si fa riferimento alle colonne all’interno dei tipi di dato astratti, anteponendo al nome dell’attributo il nome della colonna, e facendo procedere quest’ultimo da una variabile di correlazione.

Ad esempio la seguente query restituisce la colonna Cliente_id, e la colonna Nome.

La colonna Nome è un attributo del tipo di dati che definisce la colonna Persona, per cui si dovrà fare riferimento all’attributo con la notazione Persona.Nome :

 

select Cliente_id, c.Persona.Nome

from CLIENTE c; 

Nota.

Quando si esegue una query sugli attributi di un tipo di dati astratto, è necessario utilizzare una variabile di correlazione per la tabella, come mostrato in questo esempio.

 

Per impostare gli attributi di visualizzazione per gli attributi di un tipo di dati astratto in SQL*Plus si utilizza il comando column, specificando il nome del tipo di dati e l’attributo:

 

column Cliente_id format 9999999;

column Persona.Nome format A25;

 

Per fare riferimento ad attributi all’interno del tipo di dati INDIRIZZO_TY, occorre specificare il percorso completo attraverso le colonne correlate. Ad esempio per fare riferimento alla colonna via occorre scrivere:

 

Persona.Indirizzo.Via

 

Descrivendo per esteso la sua collocazione all’interno della struttura della tabella.

 

Select c.Persona.Nome, c.Persona.Indirizzo.Citta

From CLIENTE c

Where c.Persona.Indirizzo.Cirra like ‘C%’;

 

Dato che la colonna Citta viene utilizzata con un intervallo di ricerca all’interno della clausola where, l’ottimizzatore di Oracle è in grado di utilizzare un’indice al momento di risolvere la query. Per creare un indice su una colonna che faccia parte di un tipo di dati astratto, si deve specificare il percorso completo sino alla colonna come parte del comando create index.

 

Create index I_CLIENTE$CITTA

On CLIENTE(Persona.Indirizzo.Citta);

 

Con questo indice ogni volta che si accede alla colonna Citta, l’ottimizzatore di Oracle potrà valutare il suo utilizzo.

  Importante

Per creare indici su tabelle basate su tipi di dati astratto, è necessario considerare come avviene l’accesso alle colonne all’interno di tali tipi di dato. Se, come avviene per la colonna Citta, nell’esempio precedente, alcune colonne vengono utilizzate normalmente nelle query come parte delle condizioni di limitazione, queste colonne devono essere indicizzate. A questo riguardo, la rappresentazione di più colonne in un unico tipo di dati astratto può determinare un peggioramento delle prestazioni dell’applicazione, in quanto può mascherare l’esigenza di indicizzare colonne specifiche all’interno del tipo di dati.

 

Con i tipi di dato astratti, ci si abitua a trattare un gruppo di colonne come un’unica entità.

 

E’ importante ricordare però che l’ottimizzatore, in sede di valutazione dei percorsi di accesso all’informazione, prende in considerazione le colonne singolarmente. Inoltre l’indice agisce sulla tabella e non sul tipo INDIRIZZO_TY.

 

Pertanto, uno dei vantaggi offerti dai tipi di dato astratti ossia la capacità di migliorare l’aderenza agli standard per la rappresentazione di dati logici, non si estende alla rappresentazione dei dati fisici.

Ciascuna implementazione fisica deve essere curata separatamente.

 
 
 

Oracle Tipi Dati Astratti Lezione 2

Post n°28 pubblicato il 12 Agosto 2010 da Pietro_Bonfigli
 

 Uso dei Tipi Semplici.

I tipi semplici (o distinct type) sono la forma più semplice di estensione del sistema dei tipi fornita da un ORDBMS, consentono agli utenti di creare nuovi tipi di dati, basati su un solo tipo (built-in o user-defined);

Inoltre:

  • Sono usati per definire tipi di dati che richiedono operazioni diverse rispetto al tipo su cui sono definiti;

  • Sono considerati dal DBMS totalmente distinti dal tipo su cui si basano;

  • I valori del tipo semplice non sono direttamente confrontabili con quelli del tipo su cui si basano (strong typing);

  • I confronti con il tipo base o con altri tipi semplici definiti sullo stesso tipo base richiedono operazioni di cast;

  • l’ORDBMS crea automaticamente una funzione di cast quando un nuovo tipo di dati semplice viene creato;

  • Non è fornito alcun meccanismo di ereditarietà e subtyping per i tipi semplici;

Si supponga di creare un nuovo tipo id_impiegato basato sul tipo intero:

Come il tipo intero, id_impiegato è utilizzato per memorizzare valori numerici ma il DBMS tratterà i due tipi come tipi distinti.

Per i due tipi possono essere definite operazioni diverse (ad esempio la somma di due identificatori non ha senso, mentre potrebbe essere utile una operazione di confronto).

SQL-99 consente di definire tipi semplici, basati solo su tipi built-in utilizzando la clausola:

CREATE TYPE is varray(<limit>) of ;


La definizione del tipo id_impiegato può essere la seguente:


CREATE TYPE id_impiegato is varray(1) of INTEGER;


CREATE TABLE Impiegati(

id id_impiegato,

nome varchar(50),

età integer,

id_manager id_impiegato);

CAST.

I valori dei distinct type sono considerati come distinti dai valori del tipo di base, ossia impiegato non è un tipo integer.

Inoltre il casting non è automatico, le funzioni di cast (se necessarie) vanno implementate esplicitamente, eventualmente direttamente dal sistema. La seguente query restituisce un errore:

SELECT nome FROM Impiegati WHERE id_manager = 123;

La corretta sintassi è la seguente:

select * from Impiegati, table(id) i
where i.column_value = …;

Questa naturalmente è una operazione di casting implicita.

Uso dei Tipi di Dato Astratti.

E’ possibile utilizzare Tipi di dato Astratti per raggruppare in oggetti, colonne correlate. Per esempio, le colonne che fanno parte di informazioni relative a indirizzi di persone fisiche possono essere raggruppate in un tipo di dati INDIRIZZO_TY tramite un comando di create type es.:

create type INDIRIZZO_TY as object

( Via varchar2(…),

Città varchar2(…),

Provincia varchar2(…),

CAP varchar2(…)

);


Il comando create type del listato precedente crea un tipo di dati astratto nominato INDIRIZZO_TY, che può essere utilizzato quando si creano altri oggetti di database, o in una qualsiasi definizione di variabile.

Ad es.:

create type PERSONA_TY as object

(Nome varchar2(…),

Indirizzo INDIRIZZO_TY

);

Oppure in una procedura che utilizza il tipo stesso:

declare

Vtty_Indirizzo INDIRIZZO_TY;


Naturalmente la generica variabile definita di tipo INDIRIZZO_TY conterrà un puntatore ad una struttura multi valore.

 
 
 
 
 

© Italiaonline S.p.A. 2024Direzione e coordinamento di Libero Acquisition S.á r.l.P. IVA 03970540963