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 archiviato come oggetto database che può essere utilizzato in seguito.
In questo tutorial imparerai-
- Componenti dei pacchetti
- Specifica del pacchetto
- Corpo del pacchetto
- Riferimento agli elementi del pacchetto
- Crea pacchetto in PL / SQL
- Dichiarazioni in avanti
- Utilizzo dei cursori nel pacchetto
- Sovraccarico
- Dipendenza nei pacchetti
- Informazioni sulla confezione
- FILE UTL - Una panoramica
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 tutte le variabili pubbliche, i cursori, gli oggetti, le procedure, le funzioni e le eccezioni.
Di seguito sono riportate alcune caratteristiche delle specifiche del pacchetto.
- È possibile accedere agli elementi tutti dichiarati nella specifica 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 solo senza il corpo del pacchetto.
- Ogni volta che un pacchetto ha fatto riferimento, un'istanza del pacchetto viene creata per quella particolare sessione.
- Dopo che l'istanza è stata creata per una sessione, tutti gli elementi del pacchetto che vengono avviati in quell'istanza sono validi fino alla fine della sessione.
Sintassi
CREATE [OR REPLACE] PACKAGEIS … END
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 dichiarati nella specifica.
- Può anche avere più sottoprogrammi o altri elementi che non sono 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 della specifica.
- Gli elementi privati devono 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 anticipata) 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 BODYIS . END
- La sintassi precedente mostra la creazione del corpo del pacchetto.
Ora vedremo come fare riferimento agli elementi del pacchetto nel programma.
Riferimento agli elementi del pacchetto
Una volta che gli elementi sono stati dichiarati e definiti nel pacchetto, è necessario fare riferimento agli elementi per utilizzarli.
È 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 i valori da essi, ad esempio "
Crea pacchetto in PL / SQL
In PL / SQL ogni volta che un pacchetto viene indicato / chiamato in una sessione, verrà creata una nuova istanza per quel pacchetto.
Oracle fornisce una funzione per inizializzare gli elementi del pacchetto o per 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
CREATE [OR REPLACE] PACKAGE BODYIS .BEGINE END
- La sintassi precedente mostra la definizione di inizializzazione del pacchetto nel corpo del pacchetto.
Dichiarazioni in avanti
La dichiarazione / riferimento in avanti nel pacchetto non è altro che dichiarare gli elementi privati separatamente e definirli nella parte successiva del corpo del pacchetto.
Gli elementi privati possono essere riferiti 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 del tempo gli elementi privati sono dichiarati e definiti nella prima parte del corpo del pacchetto.
La dichiarazione in avanti è un'opzione fornita da Oracle, non è obbligatoria e l'utilizzo e il non utilizzo dipendono dai requisiti del programmatore.
Sintassi:
CREATE [OR REPLACE] PACKAGE BODYIS … … .BEGIN ;END
La sintassi precedente mostra la dichiarazione in avanti. Gli elementi privati sono dichiarati separatamente nella parte anteriore del pacchetto e sono stati definiti nella parte successiva.
Utilizzo dei cursori nel pacchetto
A differenza di altri elementi, bisogna stare attenti nell'usare i cursori all'interno del pacchetto.
Se il cursore è definito nella specifica del pacchetto o nella parte globale del corpo del pacchetto, il cursore una volta aperto persisterà fino alla fine della sessione.
Quindi si dovrebbe sempre usare gli attributi del cursore '% ISOPEN' per verificare lo stato del cursore prima di riferirlo.
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, ovvero sottoprogrammi con lo stesso nome ma con un numero diverso di parametri, diversi tipi di parametri o diversi tipi di parametri sono considerati sovraccarico.
Ciò è utile quando molti sottoprogrammi devono svolgere la stessa operazione, ma il modo di chiamarli dovrebbe essere diverso. In questo caso, il nome del sottoprogramma verrà mantenuto uguale per tutti e i parametri verranno modificati come da istruzione chiamante.
Esempio 1 : in questo esempio, creeremo un pacchetto per ottenere e impostare i valori delle informazioni sui dipendenti nella tabella "emp". La funzione get_record restituirà l'output del tipo di record per il numero di dipendenti specificato e la procedura set_record inserirà il record del tipo di record nella tabella emp.
Passaggio 1) Creazione delle specifiche del pacchetto
CREATE OR REPLACE PACKAGE guru99_get_setISPROCEDURE 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.
Passaggio 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.
CREATE OR REPLACE PACKAGE BODY guru99_get_setIS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)ISPRAGMA AUTONOMOUS_TRANSACTION;BEGININSERT INTO empVALUES(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%ROWTYPEISl_emp_rec emp%ROWTYPE;BEGINSELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_noRETURN 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. Equivale a definire la procedura autonoma in PL / SQL.
- Riga di codice 17-24: definizione dell'elemento "get_record". È lo stesso che definire la funzione standalone.
- Riga di codice 25-26: definizione della parte di inizializzazione del pacchetto.
Passaggio 3) Creazione di un blocco anonimo per inserire e visualizzare i record facendo riferimento al pacchetto creato sopra.
DECLAREl_emp_rec emp%ROWTYPE;l_get_rec emp%ROWTYPE;BEGINdbms 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 1004Control is now executing the package initialization partRecord insertedCalling get function to display the inserted recordEmployee name: CCCEmployee number: 1004Employee salary: 20000Employee manager: BBB
Spiegazione del codice:
- Riga di codice 34-37: Popolamento dei dati per la variabile del tipo di record in un blocco anonimo per chiamare l'elemento "set_record" del pacchetto.
- Riga codice 38: è stata effettuata una chiamata a "set_record" del pacchetto guru99_get_set. Ora il pacchetto viene 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 riferito per la seconda volta durante la chiamata "get_record" al pacchetto. Ma la parte di inizializzazione non viene eseguita questa volta poiché il pacchetto è già inizializzato in questa sessione.
- Riga di codice 42-45: stampa dei dettagli del dipendente.
Dipendenza nei pacchetti
Poiché il pacchetto è il raggruppamento logico di cose correlate, ha alcune dipendenze. Di seguito sono riportate le dipendenze da curare.
- Una specifica è un oggetto autonomo.
- Il corpo di un pacchetto dipende dalle specifiche.
- Il corpo del pacchetto può essere compilato separatamente. Ogni volta che viene compilata la specifica, il corpo deve essere ricompilato poiché non sarà più 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 essere in uno stato valido al momento della compilazione del pacchetto.
Informazioni sulla confezione
Una volta create le informazioni sul pacchetto, le informazioni sul pacchetto come l'origine del pacchetto, i dettagli del sottoprogramma e i dettagli del sovraccarico sono disponibili nelle tabelle di definizione dei dati Oracle.
La tabella seguente fornisce la tabella di definizione dei dati e le informazioni sul pacchetto disponibili nella tabella.
Nome tabella | Descrizione | Query |
ALL_OBJECT | Fornisce i dettagli del pacchetto come object_id, creation_date, last_ddl_time, ecc. Conterrà gli oggetti creati da tutti gli utenti. | SELEZIONA * DA all_objects dove object_name = '
|
USER_OBJECT | Fornisce i dettagli del pacchetto come object_id, creation_date, last_ddl_time, ecc. Conterrà gli oggetti creati dall'utente corrente. | SELEZIONA * DA oggetti_utente dove nome_oggetto = ' |
ALL_SOURCE | Fornisce l'origine degli oggetti creati da tutti gli utenti. | SELEZIONA * DA all_source dove name = '
|
USER_SOURCE | Fornisce l'origine degli oggetti creati dall'utente corrente. | SELEZIONA * DA user_source dove name = '
|
ALL_PROCEDURES | Fornisce i dettagli del sottoprogramma come object_id, dettagli sull'overload, ecc. Creati da tutti gli utenti. | SELEZIONA * FROM all_procedures Dove nome_oggetto = ' |
USER_PROCEDURES | Fornisce i dettagli del sottoprogramma come object_id, dettagli sull'overload, ecc. Creati dall'utente corrente. | SELEZIONA * FROM procedure_utente Dove nome_oggetto = ' |
FILE UTL - Una panoramica
Il file UTL è il pacchetto di utilità separato fornito da Oracle per eseguire attività speciali. Viene utilizzato principalmente per leggere e scrivere i file del sistema operativo da pacchetti o sottoprogrammi PL / SQL. Ha le funzioni separate per inserire le informazioni e per ottenere le informazioni dai file. Consente inoltre 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 / SQL e ora dovresti essere in grado di lavorare nel seguente.
- Pacchetti PL / SQL e relativi componenti
- Caratteristiche dei pacchetti
- Riferimento e sovraccarico di elementi del pacchetto
- Gestione delle dipendenze nei pacchetti
- Visualizzazione delle informazioni sul pacchetto
- Cos'è il file UTL