Oracle Tutorial sui tipi di oggetti PL/SQL con ESEMPI
Cos'è il tipo di oggetto in PL/SQL?
La programmazione orientata agli oggetti è particolarmente adatta per la creazione di componenti riutilizzabili e applicazioni complesse. Sono organizzate attorno a "oggetti" piuttosto che ad "azioni", ovvero i programmi sono progettati per funzionare e interagire con l'intero oggetto piuttosto che con la singola azione. Questo concetto consente al programmatore di popolare e manipolare i dettagli a livello di entità oggetto.
L'immagine sotto mostra un esempio del tipo di oggetto in cui un conto bancario è considerato un'entità oggetto. Gli attributi dell'oggetto includono cose che contengono alcuni valori di attributo, ad esempio in Conto bancario; è il numero di conto, il saldo bancario, ecc. mentre i metodi dell'oggetto descrivono cose come il calcolo del tasso di interesse, la generazione dell'estratto conto, ecc. che richiede il completamento di determinati processi.
In PL/SQL la programmazione orientata agli oggetti si basa sui tipi di oggetto.
Un tipo di oggetto può rappresentare qualsiasi entità del mondo reale. Discuteremo più tipi di oggetti in questo capitolo.
Componenti dei tipi di oggetto
PL / SQL il tipo di oggetto contiene principalmente due componenti.
- Attributi
- Membri/Metodi
Attributi
Gli attributi sono la colonna o il campo in cui vengono archiviati i dati. Ogni attributo verrà mappato al tipo di dati che definisce il tipo di elaborazione e archiviazione per quell'attributo. L'attributo può essere qualsiasi valido Tipo di dati PL/SQLoppure può essere di un altro tipo di oggetto.
Membri/Metodi
I membri o i metodi sono sottoprogrammi definiti nel tipo di oggetto. Non vengono utilizzati per memorizzare alcun dato. Vengono utilizzati principalmente per definire il processo all'interno del tipo di oggetto. Ad esempio, convalida dei dati prima di popolare il tipo di oggetto. Sono dichiarati nella sezione del tipo di oggetto e definiti nella sezione del corpo del tipo di oggetto del tipo di oggetto. La sezione del corpo nel tipo di oggetto è una parte facoltativa. Se non sono presenti membri, un tipo di oggetto non conterrà alcuna parte del corpo.
Crea oggetto in Oracle
Un tipo di oggetto non può essere creato a livello di sottoprogramma, può essere creato solo a livello di schema. Una volta definito il tipo di oggetto nello schema, lo stesso può essere utilizzato nei sottoprogrammi. Il tipo di oggetto può essere creato utilizzando 'CREATE TYPE'. Il corpo del tipo può essere creato solo dopo aver creato il relativo tipo di oggetto.
CREATE TYPE<object_type_name> AS OBJECT ( <attribute_l><datatype>, . . ); / CREATE TYPE BODY<object_type_name> AS OBJECT ( MEMBER[PROCEDURE|FUNCTION]<member_name> IS <declarative section> BEGIN <execution part> END; . . ); /
Spiegazione della sintassi:
- La sintassi precedente mostra la creazione di 'OBJECT' con attributi e 'OBJECT-BODY' con metodi.
- I metodi possono anche essere sovraccaricati nel corpo dell'oggetto.
Inizializzazione della dichiarazione del tipo di oggetto
Come altri componenti in PL/SQL, anche i tipi di oggetto devono essere dichiarati prima di utilizzarli nel programma.
Una volta creato il tipo di oggetto, è possibile utilizzarlo nella sezione dichiarativa del sottoprogramma per dichiarare una variabile di quel tipo di oggetto.
Ogni volta che una variabile viene dichiarata nel sottoprogramma come tipo di oggetto, in fase di esecuzione verrà creata una nuova istanza del tipo di oggetto e questa istanza appena creata potrà essere riferita al nome della variabile. In questo modo, un singolo tipo di oggetto può memorizzare più valori in istanze diverse.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Spiegazione della sintassi:
- La sintassi precedente mostra la dichiarazione di una variabile come tipo di oggetto nella sezione dichiarativa.
Una volta che la variabile è dichiarata come un tipo di oggetto in un sottoprogramma, sarà atomicamente nulla, ovvero l'intero oggetto stesso sarà nullo. Deve essere inizializzata con valori per usarli nel programma. Possono essere inizializzati usando i costruttori.
I costruttori sono il metodo implicito di un oggetto a cui è possibile fare riferimento con lo stesso nome del tipo di oggetto. La sintassi seguente mostra l'inizializzazione del tipo di oggetto.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Spiegazione della sintassi:
- La sintassi precedente mostra l'inizializzazione dell'istanza del tipo di oggetto con un valore null.
- Ora l'oggetto stesso non è nullo poiché è stato inizializzato, ma gli attributi all'interno dell'oggetto saranno nulli poiché non abbiamo assegnato alcun valore a questi attributi.
Costruttori
I costruttori sono il metodo implicito di un oggetto a cui è possibile fare riferimento con lo stesso nome del tipo di oggetto. Ogni volta che si fa riferimento all'oggetto per la prima volta, questo costruttore verrà chiamato implicitamente.
Possiamo anche inizializzare gli oggetti usando questi costruttori. Il costruttore può essere definito esplicitamente definendo il membro nel corpo del tipo di oggetto con lo stesso nome del tipo di oggetto.
esempio 1: Nell'esempio seguente useremo il tipo di oggetto membro per inserire il record nella tabella emp con i valori ('RRR', 1005, 20000, 1000) e ('PPP', 1006, 20000, 1001). Una volta inseriti i dati, li visualizzeremo usando il tipo di oggetto membro. Useremo anche il costruttore esplicito per popolare l'ID del gestore per impostazione predefinita con il valore 1001 per il secondo record.
Lo eseguiremo nei passaggi seguenti.
- Step1:
- Crea tipo di oggetto
- Corpo del tipo di oggetto
- Passaggio 2: creazione di un blocco anonimo per chiamare il tipo di oggetto creato tramite il costruttore implicito per emp_no 1005.
- Passaggio 3: creazione di un blocco anonimo per chiamare il tipo di oggetto creato tramite il costruttore esplicito per emp_no 1006.
Passo 1) Crea il tipo di oggetto e il corpo del tipo di oggetto
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records); /
CREATE OR REPLACE TYPE BODY emp_object AS
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,
p_salary NUMBER)
RETURN SELF AS RESULT
IS
BEGIN
Dbms_output.put_line(’Constructor fired..');
SELF.emp_no:=p_emp_no;|
SELF.emp_name:=p_emp_name;
SELF.salary:=p_salary;
SELF.managerial:=1001;
RETURN;
END:
MEMBER PROCEDURE insert_records
IS
BEGIN
INSERT INTO emp VALUES(emp_noemp_name,salary,manager);
END
MEMBER PROCEDURE display_records
IS
BEGIN
Dbms_output.put_line('Employee Name:'||emp_name);
Dbms_output.put_line('Employee Number:'||emp_no);
Dbms_output.put_line('Salary':'||salary);
Dbms_output.put_line('Manager:'||manager);
END:
END:
/
Spiegazione del codice
- Riga di codice 1-9: Creazione del tipo di oggetto 'emp_object' con 4 attributi e 3 membri. Contiene la definizione di costruttori con solo 3 parametri. (Il costruttore implicito effettivo conterrà il numero di parametri pari al numero di attributi presenti nel tipo di oggetto)
- Riga di codice 10: Creazione del corpo del tipo.
- Riga di codice 11-21: Definizione del costruttore esplicito. Assegnazione del valore del parametro agli attributi e assegnazione del valore per l'attributo 'manager' con il valore predefinito '1001'.
- Riga di codice 22-26: Definizione del membro 'insert_records' in cui i valori degli attributi vengono inseriti nella tabella 'emp'.
- Riga di codice 27-34: Definizione del membro 'display_records' in cui visualizzare i valori degli attributi del tipo di oggetto.
Uscita
Tipo creato
Corpo del tipo creato
Passo 2) Creazione di un blocco anonimo per chiamare il tipo di oggetto creato tramite il costruttore implicito per emp_no 1005
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1005,’RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END;
Spiegazione del codice
- Riga di codice 37-45: Inserimento dei record utilizzando il costruttore implicito. La chiamata al costruttore contiene il numero effettivo di valori di attributi.
- Riga di codice 38: Dichiara guru_emp_det come tipo di oggetto 'emp_object'.
- Riga di codice 41: L'istruzione 'guru_emp_det.display_records' chiama la funzione membro 'diplay_records' e vengono visualizzati i valori degli attributi
- Riga di codice 42: L'istruzione 'guru_emp_det.insert_records' chiama la funzione membro 'insert_records' e i valori degli attributi vengono inseriti nella tabella.
Uscita
Nome del dipendente: RRR
Numero dipendenti: 1005
Stipendio: 20000
Gestore: 1000
Passo 3) Creazione di un blocco anonimo per chiamare il tipo di oggetto creato tramite il costruttore esplicito per emp_no 1006
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1006,'PPP',20000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
Uscita
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Spiegazione del codice:
- Riga di codice 46-53: Inserimento dei record utilizzando il costruttore esplicito.
- Riga di codice 46: Dichiara guru_emp_det come tipo di oggetto 'emp_object'.
- Riga di codice 50: L'istruzione 'guru_emp_det.display_records' chiama la funzione membro 'display_records' e vengono visualizzati i valori degli attributi
- Riga di codice 51: L'istruzione 'guru_emp_det.insert_records' chiama la funzione membro 'insert_records' e i valori degli attributi vengono inseriti nella tabella.
Ereditarietà nel tipo di oggetto
La proprietà di ereditarietà consente al tipo di oggetto secondario di accedere a tutti gli attributi e i membri del tipo di oggetto principale o del tipo di oggetto principale.
Il tipo di oggetto secondario è chiamato tipo di oggetto ereditato e il tipo di oggetto principale è chiamato tipo di oggetto principale. La sintassi seguente mostra come creare il tipo di oggetto genitore ed ereditato.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Spiegazione della sintassi:
- La sintassi sopra mostra la creazione del tipo SUPER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Spiegazione della sintassi:
- La sintassi precedente mostra la creazione del tipo SUB. Contiene tutti i membri e gli attributi del tipo di oggetto principale.
Example1: Nell'esempio seguente, utilizzeremo la proprietà di ereditarietà per inserire il record con ID gestore '1002' per il record seguente ('RRR', 1007, 20000).
Eseguiremo il programma sopra nei seguenti passaggi
- Passaggio 1: crea il tipo SUPER.
- Passaggio 2: creare il tipo e il corpo SUB.
- Passaggio 3: creazione di un blocco anonimo per chiamare il tipo SUB.
Passo 1) Crea tipo SUPER o tipo genitore.
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50), p_salary NUMBER)RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records)NOT FINAL; /
Spiegazione del codice:
- Riga di codice 1-9: Creazione del tipo di oggetto 'emp_object' con 4 attributi e 3 membri. Contiene la definizione di costruttori con solo 3 parametri. È stato dichiarato come "NOT FINAL", quindi è di tipo genitore.
Passo 2) Crea il tipo SUB sotto il tipo SUPER.
CREATE OR REPLACE TYPE sub_emp_object UNDER emp_object (default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr); / CREATE OR REPLACE TYPE BODY sub_emp_object AS MEMBER PROCEDURE insert_default_mgr IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name:salary,manager): END; END; /
Spiegazione del codice:
- Riga di codice 10-13: Creazione di sub_emp_object come tipo ereditato con un attributo aggiuntivo "default_manager" e dichiarazione della procedura membro.
- Riga di codice 14: Creazione del corpo per il tipo di oggetto ereditato.
- Riga di codice 16 all'21 ottobre: Definizione della procedura membro che inserisce i record nella tabella "emp" con i valori del tipo di oggetto "SUPER", ad eccezione del valore del gestore. Per il valore manager, utilizza il tipo "default_manager" dal tipo "SUB".
Passo 3) Creazione di un blocco anonimo per chiamare il tipo SUB
DECLARE guru_emp_det sub_emp_object; BEGIN guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002); guru_emp_det.insert_default_mgr; COMMIT; END; /
Spiegazione del codice:
- Riga di codice 25: Dichiara 'guru_emp_det' come tipo 'sub_emp_object'.
- Riga di codice 27: inizializzazione dell'oggetto con il costruttore implicito. Il costruttore ha 5 parametri (4 attributi del tipo PARENT e 2 attributi del tipo SUB). L'ultimo parametro (1002) definisce il valore per l'attributo default_manager
- Riga di codice 28: Chiamando il membro 'insert_default_mgr' per inserire i record con l'ID gestore predefinito passato nel costruttore.
Uguaglianza di oggetti PL/SQL
L'istanza dell'oggetto che appartiene agli stessi oggetti può essere confrontata per verificarne l'uguaglianza. Per questo, abbiamo bisogno del metodo speciale nel tipo di oggetto chiamato metodo 'ORDER'.
Questo metodo 'ORDINE' dovrebbe essere la funzione che restituisce il tipo numerico. Richiede due parametri come input (primo parametro: id dell'istanza dell'oggetto self, secondo parametro: id di un'altra istanza dell'oggetto).
Viene confrontato l'ID dell'istanza dei due oggetti e il risultato viene restituito in formato numerico.
- Il valore positivo indica che l'istanza dell'oggetto SELF è maggiore di un'altra istanza.
- Il valore negativo indica che l'istanza dell'oggetto SELF è inferiore a un'altra istanza.
- Zero rappresenta che l'istanza dell'oggetto SELF è uguale a un'altra istanza.
- Se una qualsiasi delle istanze è nulla, questa funzione restituirà null.
CREATE TYPE BODY<object_type_name_ 1>AS OBJECT
(
ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1)
RETURN INTEGER IS
BEGIN
IF <attribute_name>parameter <attribute_name>THEN
RETURN -1; --any negative number will do
ELSIF id>c.id THEN
RETURN 1; —any positive number will do
ELSE
RETURN 0;
END IF;
END;
.
.
);
/
Spiegazione della sintassi:
- La sintassi precedente mostra la funzione ORDER che deve essere inclusa nel corpo del tipo per il controllo dell'uguaglianza.
- Il parametro per questa funzione dovrebbe essere un'istanza dello stesso tipo di oggetto.
- La funzione precedente può essere chiamata come "obj_instance_1.match(obj_instance_2)" e questa espressione restituirà il valore numerico come mostrato, dove obj_instance_1 e obj_instance_2 sono l'istanza di object_type_name.
Esempio 1: Nell'esempio seguente vedremo come confrontare due oggetti. Creeremo due istanze e confronteremo l'attributo 'salary' tra di loro. Faremo int due passaggi.
- Passaggio 1: creazione del tipo e del corpo dell'oggetto.
- Passaggio 2: creazione del blocco anonimo per chiamare e confrontare l'istanza dell'oggetto.
Passo 1) Creazione del tipo e del corpo dell'oggetto.
CREATE TYPE emp_object_equality AS OBJECT( salary NUMBER, ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER); /
CREATE TYPE BODY emp_object_equality AS ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER IS BEGIN IF salary<c.salary THEN RETURN -1; ELSIF salary>c.salary THEN RETURN 1; ELSE RETURN 0; END IF: END; END; /
Spiegazione del codice:
- Riga di codice 1-4: Creazione del tipo di oggetto 'emp_object_equality' con 1 attributo e 1 membro.
- Riga di codice 6-16: Definizione della funzione ORDER che confronta l'attributo 'salary' dell'istanza SELF e il tipo di istanza del parametro. Restituisce negativo se lo stipendio SELF è minore o positivo se lo stipendio SELF è maggiore e 0 se gli stipendi sono uguali.
Uscita codice:
Tipo creato
Passo 2) Creazione del blocco anonimo da chiamare per confrontare l'istanza dell'oggetto.
DECLARE l_obj_l emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_l:=emp_object_equality(15000); l_obj_2:=emp_object_equality(17000); IF l_obj_1.equalS(l_obj_2)>0 THEN Dbms_output.put_line(’Salary of first instance is greater’): ELSIF l_obj_l.equalS(l_obj_2)<0 THEN Dbms_output.put_line(’Salary of second instance is greater’); ELSE Dbms_output.put_line(’Salaries are equal’); END IF; END; /
Uscita
Salary of second instance is greater
Spiegazione del codice:
- Riga di codice 20: dichiarazione di l_obj_1 di tipo emp_object_equality.
- Riga di codice 21: dichiarazione di l_obj_2 di tipo emp_object_equality.
- Riga di codice 23: Inizializzazione l_obj_1 con valore salariale come '15000'
- Riga di codice 24: Inizializzazione l_obj_1 con valore salariale come '17000'
- Riga di codice 25-33: Stampa il messaggio in base al numero di reso dalla funzione ORDINA.
Sintesi
In questo capitolo abbiamo visto la tipologia degli oggetti e le loro proprietà. Abbiamo anche discusso di costruttori, membri, attributi, ereditarietà e uguaglianza negli oggetti PL/SQL.


















