Oracle Pacchetto PL/SQL: tipo, specifica, corpo [Esempio]

Cos'è il pacchetto in Oracle?

Il pacchetto PL/SQL è un raggruppamento logico di un sottoprogramma correlato (procedura/funzione) in un singolo elemento. Un pacchetto viene compilato e memorizzato come un oggetto di database che può essere utilizzato in seguito.

Componenti dei pacchetti

Il pacchetto PL/SQL ha due componenti.

  • Specifica del pacchetto
  • Corpo del pacchetto

Specifica del pacchetto

La specifica del pacchetto consiste in una dichiarazione di tutto il pubblico variabili, cursori, oggetti, procedure, funzioni ed eccezioni.

Di seguito sono riportate alcune caratteristiche delle specifiche del pacchetto.

  • È possibile accedere agli elementi dichiarati nelle specifiche dall'esterno del pacchetto. Tali elementi sono noti come elementi pubblici.
  • La specifica del pacchetto è un elemento autonomo, il che significa che può esistere da sola senza il corpo del pacchetto.
  • Ogni volta che un pacchetto ha fatto riferimento, viene creata un'istanza del pacchetto per quella particolare sessione.
  • Dopo la creazione dell'istanza per una sessione, tutti gli elementi del pacchetto avviati in tale istanza sono validi fino alla fine della sessione.

Sintassi

CREATE [OR REPLACE] PACKAGE <package_name> 
IS
<sub_program and public element declaration>
.
.
END <package name>

La sintassi precedente mostra la creazione della specifica del pacchetto.

Corpo del pacchetto

Consiste nella definizione di tutti gli elementi presenti nella specifica del pacchetto. Può anche avere una definizione di elementi che non sono dichiarati nella specifica, questi elementi sono chiamati elementi privati ​​e possono essere chiamati solo dall'interno del pacchetto.

Di seguito sono riportate le caratteristiche del corpo di un pacchetto.

  • Dovrebbe contenere le definizioni per tutti i sottoprogrammi/cursori che sono stati dichiarati nel capitolato d'oneri.
  • Può anche avere più sottoprogrammi o altri elementi non dichiarati nelle specifiche. Questi sono chiamati elementi privati.
  • È un oggetto affidabile e dipende dalle specifiche del pacchetto.
  • Lo stato del corpo del pacchetto diventa 'Non valido' ogni volta che la specifica viene compilata. Pertanto, deve essere ricompilato ogni volta dopo la compilazione delle specifiche.
  • Gli elementi privati ​​dovrebbero essere definiti prima di essere utilizzati nel corpo del pacchetto.
  • La prima parte del pacchetto è la parte della dichiarazione globale. Ciò include variabili, cursori ed elementi privati ​​(dichiarazione in avanti) visibili all'intero pacchetto.
  • L'ultima parte del pacchetto è la parte di inizializzazione del pacchetto che viene eseguita una volta ogni volta che si fa riferimento a un pacchetto per la prima volta nella sessione.

Sintassi:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<global_declaration part>
<Private element definition>
<sub_program and public element definition>
.
<Package Initialization> 
END <package_name>
  • La sintassi precedente mostra la creazione del corpo del pacchetto.

Ora vedremo come fare riferimento agli elementi del pacchetto nel programma.

Elementi del pacchetto di riferimento

Una volta dichiarati e definiti gli elementi nel pacchetto, dobbiamo fare riferimento agli elementi per usarli.

È possibile fare riferimento a tutti gli elementi pubblici del pacchetto chiamando il nome del pacchetto seguito dal nome dell'elemento separato da un punto, ad esempio ' . '.

La variabile pubblica del pacchetto può anche essere utilizzata allo stesso modo per assegnare e recuperare valori da essi, ad esempio ' . '.

Crea pacchetto in PL/SQL

In PL/SQL ogni volta che un pacchetto viene indirizzato/chiamato in una sessione verrà creata una nuova istanza per quel pacchetto.

Oracle fornisce la possibilità di inizializzare gli elementi del pacchetto o di eseguire qualsiasi attività al momento della creazione di questa istanza tramite "Inizializzazione del pacchetto".

Questo non è altro che un blocco di esecuzione che viene scritto nel corpo del pacchetto dopo aver definito tutti gli elementi del pacchetto. Questo blocco verrà eseguito ogni volta che si fa riferimento a un pacchetto per la prima volta nella sessione.

Sintassi

Crea pacchetto in PL/SQL

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGINE
<Package Initialization> 
END <package_name>
  • La sintassi precedente mostra la definizione di inizializzazione del pacchetto nel corpo del pacchetto.

Dichiarazioni anticipate

La dichiarazione/riferimento in avanti nel pacchetto non è altro che la dichiarazione separata degli elementi privati ​​e la loro definizione nella parte successiva del corpo del pacchetto.

È possibile fare riferimento agli elementi privati ​​solo se sono già dichiarati nel corpo del pacchetto. Per questo motivo viene utilizzata la dichiarazione anticipata. Ma è piuttosto insolito da usare perché nella maggior parte dei casi gli elementi privati ​​vengono dichiarati e definiti nella prima parte del corpo del pacchetto.

La dichiarazione anticipata è un'opzione fornita da Oracle, non è obbligatorio e l'utilizzo e il non utilizzo dipendono dai requisiti del programmatore.

Dichiarazioni anticipate

Sintassi:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element declaration>
.
.
.
<Public element definition that refer the above private element>
.
.
<Private element definition> 
.
BEGIN
<package_initialization code>; 
END <package_name>

La sintassi sopra mostra la dichiarazione in avanti. Gli elementi privati ​​sono dichiarati separatamente nella parte in avanti del pacchetto e sono stati definiti nella parte successiva.

Utilizzo dei cursori nel pacchetto

A differenza di altri elementi bisogna fare attenzione nell'uso dei cursori all'interno del pacchetto.

Se il cursore è definito nelle specifiche del pacchetto o nella parte globale del corpo del pacchetto, una volta aperto il cursore persisterà fino alla fine della sessione.

Quindi si dovrebbero sempre usare gli attributi del cursore '%ISOPEN' per verificare lo stato del cursore prima di farvi riferimento.

Sovraccarico

Il sovraccarico è il concetto di avere molti sottoprogrammi con lo stesso nome. Questi sottoprogrammi differiranno l'uno dall'altro per un numero di parametri o tipi di parametri o tipo di ritorno, ad esempio sottoprogrammi con lo stesso nome ma con diverso numero di parametri, diversi tipi di parametri o diversi tipi di parametri sono considerati come sovraccarico.

Ciò è utile quando molti sottoprogrammi devono eseguire lo stesso compito, ma il modo di richiamarli dovrebbe essere diverso. In questo caso il nome del sottoprogramma sarà mantenuto uguale per tutti ed i parametri verranno modificati come da istruzione chiamante.

esempio 1: In questo esempio, creeremo un pacchetto per ottenere e impostare i valori delle informazioni del dipendente nella tabella 'emp'. La funzione get_record restituirà l'output del tipo di record per il numero di dipendente specificato e la procedura set_record inserirà il record del tipo di record nella tabella emp.

Passo 1) Creazione delle specifiche del pacchetto

Sovraccarico

CREATE OR REPLACE PACKAGE guru99_get_set
IS
PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);
FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE;
END guru99_get_set:
/

Produzione:

Package created

Spiegazione del codice

  • Riga di codice 1-5: Creazione della specifica del pacchetto per guru99_get_set con una procedura e una funzione. Questi due sono ora elementi pubblici di questo pacchetto.

Passo 2) Il pacchetto contiene il corpo del pacchetto, in cui verranno definite tutte le procedure e le funzioni effettive. In questo passaggio viene creato il corpo del pacchetto.

Sovraccarico

CREATE OR REPLACE PACKAGE BODY guru99_get_set
IS	
PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO emp
VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no; p_emp_rec.salary,p_emp_rec.manager);
COMMIT;
END set_record;
FUNCTION get_record(p_emp_no IN NUMBER)
RETURN emp%ROWTYPE
IS
l_emp_rec emp%ROWTYPE;
BEGIN
SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no
RETURN l_emp_rec;
END get_record;
BEGUN	
dbms_output.put_line(‘Control is now executing the package initialization part');
END guru99_get_set:
/

Produzione:

Package body created

Spiegazione del codice

  • Riga di codice 7: Creazione del corpo del pacchetto.
  • Riga di codice 9-16: Definizione dell'elemento 'set_record' dichiarato nella specifica. Ciò equivale a definire la procedura autonoma in PL/SQL.
  • Riga di codice 17-24: Definizione dell'elemento 'get_record'. È come definire la funzione autonoma.
  • Riga di codice 25-26: Definizione della parte di inizializzazione del pacchetto.

Passo 3) Creazione di un blocco anonimo per inserire e visualizzare i record facendo riferimento al pacchetto sopra creato.

Sovraccarico

DECLARE
l_emp_rec emp%ROWTYPE;
l_get_rec emp%ROWTYPE;
BEGIN
dbms output.put line(‘Insert new record for employee 1004');
l_emp_rec.emp_no:=l004;
l_emp_rec.emp_name:='CCC';
l_emp_rec.salary~20000;
l_emp_rec.manager:=’BBB’;
guru99_get_set.set_record(1_emp_rec);
dbms_output.put_line(‘Record inserted');
dbms output.put line(‘Calling get function to display the inserted record'):
l_get_rec:=guru99_get_set.get_record(1004);
dbms_output.put_line(‘Employee name: ‘||l_get_rec.emp_name);
dbms_output.put_line(‘Employee number:‘||l_get_rec.emp_no);
dbms_output.put_line(‘Employee salary:‘||l_get_rec.salary');
dbms output.put line(‘Employee manager:‘||1_get_rec.manager);		
END:
/

Produzione:

Insert new record for employee 1004
Control is now executing the package initialization part
Record inserted
Calling get function to display the inserted record
Employee name: CCC
Employee number: 1004
Employee salary: 20000
Employee manager: BBB

Spiegazione del codice:

  • Riga di codice 34-37: Compilazione dei dati per la variabile di tipo record in un blocco anonimo per chiamare l'elemento 'set_record' del pacchetto.
  • Riga di codice 38: È stata effettuata una chiamata a 'set_record' del pacchetto guru99_get_set. Ora il pacchetto è istanziato e persisterà fino alla fine della sessione.
  • La parte di inizializzazione del pacchetto viene eseguita poiché questa è la prima chiamata al pacchetto.
  • Il record viene inserito dall'elemento 'set_record' nella tabella.
  • Riga di codice 41: Chiamata dell'elemento 'get_record' per visualizzare i dettagli del dipendente inserito.
  • Il pacchetto viene fatto riferimento per la seconda volta durante la chiamata 'get_record' al pacchetto. Ma questa volta la parte di inizializzazione non viene eseguita poiché il pacchetto è già inizializzato in questa sessione.
  • Riga di codice 42-45: Stampa dei dati del dipendente.

Dipendenza dai pacchetti

Poiché il pacchetto è il raggruppamento logico di cose correlate, ha alcune dipendenze. Di seguito sono riportate le dipendenze di cui ci si deve occupare.

  • Una specifica è un oggetto autonomo.
  • Il corpo del pacchetto dipende dalle specifiche.
  • Il corpo del pacchetto può essere compilato separatamente. Ogni volta che viene compilata una specifica, il corpo deve essere ricompilato poiché diventerà non valido.
  • Il sottoprogramma nel corpo del pacchetto che dipende da un elemento privato dovrebbe essere definito solo dopo la dichiarazione dell'elemento privato.
  • Gli oggetti del database a cui si fa riferimento nella specifica e nel corpo devono avere uno stato valido al momento della compilazione del pacchetto.

Informazioni sul pacchetto

Una volta create le informazioni sul pacchetto, le informazioni sul pacchetto come la fonte del pacchetto, i dettagli del sottoprogramma e i dettagli del sovraccarico sono disponibili in Oracle tabelle di definizione dei dati.

La tabella seguente fornisce la tabella di definizione dei dati e le informazioni sul pacchetto disponibili nella tabella.

Nome tabella Descrizione domanda
TUTTO_OGGETTO Fornisce i dettagli del pacchetto come object_id, creation_date, last_ddl_time, ecc. Conterrà gli oggetti creati da tutti gli utenti. SELECT * FROM all_objects dove nome_oggetto =' '
UTENTE_OGGETTO Fornisce i dettagli del pacchetto come object_id, creation_date, last_ddl_time, ecc. Conterrà gli oggetti creati dall'utente corrente. SELECT * FROM oggetti_utente dove nome_oggetto =' '
TUTTO_FONTE Fornisce l'origine degli oggetti creati da tutti gli utenti. SELECT * FROM all_source dove nome=' '
UTENTE_SOURCE Fornisce l'origine degli oggetti creati dall'utente corrente. SELECT * FROM origine_utente dove nome=' '
TUTTE_PROCEDURE Fornisce dettagli sul sottoprogramma, come object_id, dettagli sul sovraccarico, ecc., creato da tutti gli utenti. SELEZIONA * DA tutte_procedure
Dove nome_oggetto=' '
PROCEDURE_UTENTE Fornisce dettagli sul sottoprogramma, come object_id, dettagli sul sovraccarico, ecc., creato dall'utente corrente. SELEZIONA * DA procedure_utente
Dove nome_oggetto=' '

FILE UTL – Una panoramica

UTL File è il pacchetto di utilità separato fornito da Oracle per svolgere compiti speciali. Viene utilizzato principalmente per leggere e scrivere i file del sistema operativo da pacchetti o sottoprogrammi PL/SQL. Ha funzioni separate per inserire le informazioni e per ottenere informazioni dai file. Permette anche di leggere/scrivere nel set di caratteri nativi.

Il Programmatore può utilizzarlo per scrivere file del sistema operativo di qualsiasi tipo e il file verrà scritto direttamente sul server del database. Il nome e il percorso della directory verranno menzionati al momento della scrittura.

Sommario

Ora abbiamo imparato i pacchetti in PL / SQLe ora dovresti essere in grado di lavorare in quanto segue.

  • Pacchetti PL/SQL e relativi componenti
  • Caratteristiche dei pacchetti
  • Riferimento e sovraccarico degli elementi del pacchetto
  • Gestione delle dipendenze nei pacchetti
  • Visualizzazione delle informazioni sul pacchetto
  • Cos'è il file UTL