Che 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 organizzati attorno ad "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 oggetto descrivono cose come il calcolo del tasso di interesse, la generazione di un estratto conto, ecc. che richiedono il completamento di un determinato processo.
In PL / SQL la programmazione orientata agli oggetti si basa sui tipi di oggetti.
Un tipo di oggetto può rappresentare qualsiasi entità del mondo reale. Discuteremo più tipi di oggetti in questo capitolo.
In questo tutorial imparerai,
- Componenti dei tipi di oggetto
- Crea oggetto in Oracle
- Inizializzazione della dichiarazione del tipo di oggetto
- Costruttori
- Ereditarietà nel tipo di oggetto
- Uguaglianza di oggetti PL / SQL
Componenti dei tipi di oggetto
Il tipo di oggetto PL / SQL contiene principalmente due componenti.
- Attributi
- Membri / metodi
Attributi
Gli attributi sono la colonna o il campo in cui vengono memorizzati 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 di qualsiasi tipo di dati PL / SQL valido oppure può essere di un altro tipo di oggetto.
Membri / metodi
I membri oi metodi sono sottoprogrammi definiti nel tipo di oggetto. Non vengono utilizzati per memorizzare alcun dato. Sono principalmente utilizzati per definire il processo all'interno del tipo di oggetto. Per esempi di 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
Non è possibile creare un tipo di oggetto a livello di sottoprogramma, possono essere creati 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 suo tipo di oggetto.
CREATE TYPEAS OBJECT( ,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION] IS BEGIN 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, può essere utilizzato 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 può essere riferita al nome della variabile. In questo modo, un singolo tipo di oggetto può memorizzare più valori in istanze diverse.
DECLARE;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 è stata dichiarata come un tipo di oggetto in un sottoprogramma, sarà atomicamente nulla, cioè l'intero oggetto stesso è un valore nullo. Deve essere inizializzato con valori per utilizzarli nel programma. Possono essere inizializzati utilizzando i costruttori.
I costruttori sono il metodo implicito di un oggetto a cui è possibile fare riferimento con lo stesso nome di quello del tipo di oggetto. La sintassi seguente mostra l'inizializzazione del tipo di oggetto.
DECLARE;BEGIN := ();END;/
Spiegazione della sintassi:
- La sintassi precedente mostra l'inizializzazione dell'istanza del tipo di oggetto con un valore nullo.
- Ora l'oggetto stesso non è nullo in quanto è 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 di quello 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 : nel seguente esempio utilizzeremo il membro del tipo di oggetto per inserire il record nella tabella emp con valori ('RRR', 1005, 20000, 1000) e ('PPP', 1006, 20000, 1001). Una volta inseriti i dati, visualizzeremo lo stesso usando il membro del tipo di oggetto. Utilizzeremo 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.
- Passo 1:
- 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.
Passaggio 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 ASCONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,p_salary NUMBER)RETURN SELF AS RESULTISBEGINDbms_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_recordsISBEGININSERT INTO emp VALUES(emp_noemp_name,salary,manager);ENDMEMBER PROCEDURE display_recordsISBEGINDbms_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.
Produzione
Tipo creato
Tipo corpo creato
Passaggio 2) Creazione di un blocco anonimo per chiamare il tipo di oggetto creato tramite il costruttore implicito per emp_no 1005
DECLAREguru_emp_det emp_object;BEGINguru_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 degli attributi.
- Riga di codice 38 : dichiara guru_emp_det come tipo di oggetto "emp_object".
- Riga di codice 41 : istruzione "guru_emp_det.display_records" chiamata funzione membro "diplay_records" e vengono visualizzati i valori degli attributi
- Riga di codice 42 : istruzione "guru_emp_det.insert_records" chiamata funzione membro "insert_records" e i valori degli attributi vengono inseriti nella tabella.
Produzione
Nome dipendente: RRR
Numero dipendente: 1005
Stipendio: 20000
Gestore: 1000
Passaggio 3) Creazione di un blocco anonimo per chiamare il tipo di oggetto creato tramite il costruttore esplicito per emp_no 1006
DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1006,'PPP',20000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;/
Produzione
Employee Name:PPPEmployee Number:1006Salary:20000Manager: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 codice 50 : istruzione "guru_emp_det.display_records" chiamata funzione membro "display_records" e vengono visualizzati i valori degli attributi
- Riga di codice 51 : istruzione "guru_emp_det.insert_records" chiamata funzione membro "insert_records" e i valori degli attributi vengono inseriti nella tabella.
Ereditarietà nel tipo di oggetto
La proprietà Ereditarietà consente al tipo di oggetto secondario di accedere a tutti gli attributi e ai membri del tipo di oggetto super o del tipo di oggetto padre.
Il tipo di oggetto secondario è chiamato tipo di oggetto ereditato e il tipo di oggetto super è chiamato tipo di oggetto padre. La sintassi seguente mostra come creare il tipo di oggetto genitore ed ereditato.
CREATE TYPEAS OBJECT( ,… )NOT FINAL;/
Spiegazione della sintassi:
- La sintassi sopra mostra la creazione del tipo SUPER.
CREATE TYPEUNDER ( ,.);/
Spiegazione della sintassi:
- La sintassi precedente mostra la creazione del tipo SUB. Contiene tutti i membri e gli attributi del tipo di oggetto padre.
Esempio1: Nell'esempio seguente, utilizzeremo la proprietà di ereditarietà per inserire il record con ID gestore come "1002" per il record seguente ("RRR", 1007, 20000).
Eseguiremo il programma di cui 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.
Passaggio 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 "NON FINALE" quindi è di tipo genitore.
Passaggio 2) Crea il tipo SUB sotto il tipo SUPER.
CREATE OR REPLACE TYPE sub_emp_objectUNDER emp_object(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);/CREATE OR REPLACE TYPE BODY sub_emp_objectASMEMBER PROCEDURE insert_default_mgrISBEGININSERT INTO empVALUES(emp_no,emp_name:salary,manager):END;END;/
Spiegazione del codice:
- Riga di codice 10-13 : creazione del sub_emp_object come tipo ereditato con un attributo aggiuntivo "default_manager" e dichiarazione di procedura membro.
- Riga di codice 14 : creazione del corpo per il tipo di oggetto ereditato.
- Riga di codice 1 6 -21 : Definizione della procedura membro che sta inserendo i record nella tabella "emp" con i valori del tipo di oggetto "SUPER", ad eccezione del valore manager. Per il valore manager, utilizza il tipo "default_manager" da "SUB".
Passaggio 3) Creazione di un blocco anonimo per chiamare il tipo SUB
DECLAREguru_emp_det sub_emp_object;BEGINguru_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 : dichiarazione di "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 dal tipo PARENT e 2 attributi dal tipo SUB). L'ultimo parametro (1002) definisce il valore per l'attributo default_manager
- Riga codice 28 : chiamata al 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 l'uguaglianza. Per questo, abbiamo bisogno del metodo speciale nel tipo di oggetto chiamato metodo "ORDER".
Questo metodo "ORDER" dovrebbe essere la funzione che restituisce il tipo numerico. Accetta due parametri come input, (primo parametro: id dell'istanza dell'oggetto-sé, secondo parametro: id di un'altra istanza dell'oggetto).
L'id dell'istanza di due oggetti viene confrontato 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 rappresenta che l'istanza dell'oggetto SELF è minore di un'altra istanza.
- Zero rappresenta che l'istanza dell'oggetto SELF è uguale a un'altra istanza.
- Se una delle istanze è null, questa funzione restituirà null.
CREATE TYPE BODYAS OBJECT(ORDER MEMBER FUNCTION match( object_type_name_ 1)RETURN INTEGER IS BEGINIF parameter THENRETURN -1; --any negative number will doELSIF id>c.id THENRETURN 1; -any positive number will doELSERETURN 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 "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 : nel seguente esempio vedremo come confrontare due oggetti. Creeremo due istanze e confronteremo l'attributo "stipendio" tra di loro. Faremo due passaggi.
- Passaggio 1: creazione del tipo e del corpo dell'oggetto.
- Passaggio 2: creazione del blocco anonimo da chiamare confronta l'istanza dell'oggetto.
Passaggio 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 ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN IF salaryc.salaryTHEN RETURN 1;ELSERETURN 0;END IF: END;END;/
Spiegazione del codice:
- Riga di codice 1-4: creazione del tipo di oggetto "emp_object_equality" con 1 attributi 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 è inferiore o positivo se lo stipendio SELF è maggiore e 0 se gli stipendi sono uguali.
Uscita codice:
Tipo creato
Passaggio 2) Creazione del blocco anonimo da chiamare confronta l'istanza dell'oggetto.
DECLAREl_obj_l emp_object_equality;l_obj_2 emp_object_equality;BEGINl_obj_l:=emp_object_equality(15000);l_obj_2:=emp_object_equality(17000);IF l_obj_1.equalS(l_obj_2)>0THENDbms_output.put_line(’Salary of first instance is greater’):ELSIF l_obj_l.equalS(l_obj_2)<0THENDbms_output.put_line(’Salary of second instance is greater’);ELSEDbms_output.put_line(’Salaries are equal’);END IF;END;/
Produzione
Salary of second instance is greater
Spiegazione del codice:
- Riga di codice 20 : dichiarazione del tipo l_obj_1 di emp_object_equality.
- Riga di codice 21 : dichiarazione del tipo l_obj_2 di emp_object_equality.
- Riga di codice 23 : inizializzazione di l_obj_1 con il valore dello stipendio "15000"
- Riga di codice 24 : inizializzazione di l_obj_1 con il valore dello stipendio "17000"
- Riga di codice 25-33 : stampa il messaggio in base al numero di ritorno dalla funzione ORDINE.
Sommario
In questo capitolo abbiamo visto il tipo di oggetto e le loro proprietà. Abbiamo anche discusso di costruttori, membri, attributi, ereditarietà e uguaglianza negli oggetti PL / SQL.