Wat is pakket in Oracle?
PL / SQL-pakket is een logische groepering van een gerelateerd subprogramma (procedure / functie) in een enkel element. Een pakket wordt gecompileerd en opgeslagen als een databaseobject dat later kan worden gebruikt.
In deze tutorial leer je-
- Componenten van pakketten
- Pakketspecificatie
- Pakketbehuizing
- Verwijzende pakketelementen
- Maak een pakket in PL / SQL
- Verklaringen doorsturen
- Cursorsgebruik in pakket
- Overbelasting
- Afhankelijkheid in pakketten
- Pakket informatie
- UTL-BESTAND - Een overzicht
Componenten van pakketten
PL / SQL-pakket heeft twee componenten.
- Pakketspecificatie
- Pakketbehuizing
Pakketspecificatie
Pakketspecificatie bestaat uit een declaratie van alle openbare variabelen, cursors, objecten, procedures, functies en uitzonderingen.
Hieronder staan enkele kenmerken van de pakketspecificatie.
- De elementen die allemaal in de specificatie zijn gedeclareerd, zijn toegankelijk van buiten het pakket. Dergelijke elementen staan bekend als een openbaar element.
- De pakketspecificatie is een op zichzelf staand element, wat betekent dat het alleen kan bestaan zonder de hoofdtekst van het pakket.
- Telkens wanneer een pakket heeft verwezen, wordt er een exemplaar van het pakket gemaakt voor die specifieke sessie.
- Nadat de instantie voor een sessie is gemaakt, zijn alle pakketelementen die in die instantie worden gestart geldig tot het einde van de sessie.
Syntaxis
CREATE [OR REPLACE] PACKAGEIS … END
De bovenstaande syntaxis toont het maken van pakketspecificaties.
Pakketbehuizing
Het bestaat uit de definitie van alle elementen die aanwezig zijn in de pakketspecificatie. Het kan ook een definitie hebben van elementen die niet in de specificatie zijn gedeclareerd, deze elementen worden privéelementen genoemd en kunnen alleen vanuit het pakket worden aangeroepen.
Hieronder staan kenmerken van een pakketlichaam.
- Het zou definities moeten bevatten voor alle subprogramma's / cursors die in de specificatie zijn gedeclareerd.
- Het kan ook meer subprogramma's of andere elementen bevatten die niet in de specificatie zijn gedeclareerd. Dit worden privé-elementen genoemd.
- Het is een betrouwbaar object en hangt af van de pakketspecificatie.
- De status van de body van het pakket wordt 'ongeldig' wanneer de specificatie wordt gecompileerd. Daarom moet het elke keer opnieuw worden gecompileerd na het compileren van de specificatie.
- De privé-elementen moeten eerst worden gedefinieerd voordat ze in de pakkettekst worden gebruikt.
- Het eerste deel van het pakket is het globale aangiftegedeelte. Dit omvat variabelen, cursors en privé-elementen (voorwaartse declaratie) die zichtbaar is voor het hele pakket.
- Het laatste deel van het pakket is Pakketinitialisatie-onderdeel dat één keer wordt uitgevoerd wanneer een pakket voor de eerste keer in de sessie wordt verwezen.
Syntaxis:
CREATE [OR REPLACE] PACKAGE BODYIS . END
- De bovenstaande syntaxis toont het maken van de pakketbody.
Nu gaan we zien hoe pakketelementen in het programma kunnen worden verwezen.
Verwijzende pakketelementen
Zodra de elementen zijn gedeclareerd en gedefinieerd in het pakket, moeten we de elementen verwijzen om ze te gebruiken.
Alle openbare elementen van het pakket kunnen worden verwezen door de pakketnaam aan te roepen gevolgd door de elementnaam gescheiden door een punt, dwz '
De publieke variabele van het pakket kan ook op dezelfde manier worden gebruikt om waarden toe te wijzen en op te halen, dwz '
Maak een pakket in PL / SQL
Wanneer in PL / SQL een pakket wordt verwezen / aangeroepen in een sessie, wordt er een nieuw exemplaar voor dat pakket gemaakt.
Oracle biedt een mogelijkheid om pakketelementen te initialiseren of om een activiteit uit te voeren op het moment dat dit exemplaar wordt gemaakt via 'Pakketinitialisatie'.
Dit is niets anders dan een uitvoeringsblok dat in de pakketbody wordt geschreven nadat alle pakketelementen zijn gedefinieerd. Dit blok wordt uitgevoerd wanneer een pakket voor de eerste keer in de sessie wordt verwezen.
Syntaxis
CREATE [OR REPLACE] PACKAGE BODYIS .BEGINE END
- De bovenstaande syntaxis toont de definitie van pakketinitialisatie in de pakkettekst.
Verklaringen doorsturen
Voorwaartse aangifte / verwijzing in het pakket is niets anders dan het afzonderlijk declareren van de privé-elementen en het definiëren ervan in het latere deel van de hoofdtekst van het pakket.
Er kan alleen naar privé-elementen worden verwezen als deze al in de pakkettekst zijn gedeclareerd. Om deze reden wordt gebruik gemaakt van voorwaartse aangifte. Maar het is nogal ongebruikelijk om te gebruiken, omdat in de meeste tijd privé-elementen worden gedeclareerd en gedefinieerd in het eerste deel van de body van het pakket.
Voorwaartse aangifte is een optie die door Oracle wordt geboden, het is niet verplicht en het gebruik en niet gebruiken voldoet aan de eisen van de programmeur.
Syntaxis:
CREATE [OR REPLACE] PACKAGE BODYIS … … .BEGIN ;END
De bovenstaande syntaxis toont voorwaartse declaratie. De privé-elementen worden afzonderlijk gedeclareerd in het voorste deel van het pakket, en ze zijn gedefinieerd in het latere deel.
Cursorsgebruik in pakket
In tegenstelling tot andere elementen moet men voorzichtig zijn bij het gebruik van cursors in het pakket.
Als de cursor is gedefinieerd in de pakketspecificatie of in het globale deel van de hoofdtekst van het pakket, zal de eenmaal geopende cursor blijven bestaan tot het einde van de sessie.
Je moet dus altijd de cursorattributen '% ISOPEN' gebruiken om de staat van de cursor te verifiëren voordat je ernaar verwijst.
Overbelasting
Overbelasting is het concept van veel subprogramma's met dezelfde naam. Deze subprogramma's zullen van elkaar verschillen door een aantal parameters of typen parameters of retourtype, dwz een subprogramma met dezelfde naam maar met een verschillend aantal parameters, verschillende soorten parameters of verschillende hertypes worden als overbelast beschouwd.
Dit is handig als veel subprogramma's dezelfde taak moeten uitvoeren, maar de manier waarop ze elk van hen moeten worden aangeroepen, moet anders zijn. In dit geval wordt de naam van het subprogramma voor iedereen hetzelfde gehouden en worden de parameters gewijzigd volgens de aanroepinstructie.
Voorbeeld 1 : In dit voorbeeld gaan we een pakket maken om de waarden van de werknemersinformatie in de 'emp'-tabel op te halen en in te stellen. De functie get_record retourneert de uitvoer van het recordtype voor het opgegeven personeelsnummer, en de procedure set_record zal het recordtype record in de emp-tabel invoegen.
Stap 1) Pakketspecificatie maken
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:/
Uitgang:
Package created
Code Verklaring
- Coderegel 1-5 : het creëren van de pakketspecificatie voor guru99_get_set met één procedure en één functie. Deze twee zijn nu openbare elementen van dit pakket.
Stap 2) Pakket bevat pakketlichaam, waar alle procedures en functies feitelijke definitie zullen worden gedefinieerd. In deze stap wordt pakketlichaam gemaakt.
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:/
Uitgang:
Package body created
Code Verklaring
- Coderegel 7 : de body van het pakket maken.
- Coderegel 9-16 : Definiëren van het element 'set_record' dat wordt gedeclareerd in de specificatie. Dit is hetzelfde als het definiëren van de zelfstandige procedure in PL / SQL.
- Coderegel 17-24: Definiëren van het element 'get_record'. Het is hetzelfde als het definiëren van de zelfstandige functie.
- Coderegel 25-26: Definiëren van het pakketinitialisatie-onderdeel.
Stap 3) Een anoniem blok maken om de records in te voegen en weer te geven door te verwijzen naar het hierboven gemaakte pakket.
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:/
Uitgang:
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
Code Verklaring:
- Coderegel 34-37: het vullen van de gegevens voor de recordtypevariabele in een anoniem blok om het 'set_record'-element van het pakket aan te roepen.
- Coderegel 38: Er is gebeld naar 'set_record' van het guru99_get_set-pakket. Nu wordt het pakket geïnstantieerd en blijft het bestaan tot het einde van de sessie.
- Het initialisatiegedeelte van het pakket wordt uitgevoerd aangezien dit de eerste aanroep naar het pakket is.
- Het record wordt ingevoegd door het element 'set_record' in de tabel.
- Coderegel 41: Roep het element 'get_record' aan om de details van de ingevoegde werknemer weer te geven.
- Het pakket wordt voor de tweede keer verwezen tijdens de 'get_record'-aanroep naar het pakket. Maar het initialisatiegedeelte wordt deze keer niet uitgevoerd omdat het pakket al in deze sessie is geïnitialiseerd.
- Coderegel 42-45: Afdrukken van de werknemersgegevens.
Afhankelijkheid in pakketten
Aangezien het pakket de logische groepering van verwante zaken is, heeft het enkele afhankelijkheden. Hieronder volgen de afhankelijkheid waarmee rekening moet worden gehouden.
- Een specificatie is een zelfstandig object.
- De body van een pakket is afhankelijk van de specificatie.
- De body van het pakket kan afzonderlijk worden samengesteld. Elke keer dat de specificatie wordt gecompileerd, moet de body opnieuw worden gecompileerd, omdat deze ongeldig wordt.
- Het subprogramma in de body van het pakket dat afhankelijk is van een privé-element, moet pas worden gedefinieerd na de declaratie van het privé-element.
- De databaseobjecten waarnaar in de specificatie en hoofdtekst wordt verwezen, moeten een geldige status hebben op het moment dat het pakket wordt samengesteld.
Pakket informatie
Nadat de pakketinformatie is gemaakt, zijn de pakketinformatie, zoals de pakketbron, subprogrammadetails en overbelastingsdetails, beschikbaar in de Oracle-gegevensdefinitietabellen.
Onderstaande tabel geeft de gegevensdefinitietabel en de pakketinformatie die in de tabel beschikbaar is.
Tafel naam | Omschrijving | Vraag |
ALL_OBJECT | Geeft de details van het pakket zoals object_id, creation_date, last_ddl_time, etc. Het zal de objecten bevatten die door alle gebruikers zijn gemaakt. | SELECTEER * UIT all_objects waarbij object_name = '
|
USER_OBJECT | Geeft de details van het pakket zoals object_id, creation_date, last_ddl_time, etc. Het zal de objecten bevatten die zijn gemaakt door de huidige gebruiker. | SELECT * FROM user_objects waarbij object_name = '
|
ALL_SOURCE | Geeft de bron van de objecten die door alle gebruikers zijn gemaakt. | SELECTEER * UIT all_source waar name = '
|
USER_SOURCE | Geeft de bron van de objecten die door de huidige gebruiker zijn gemaakt. | SELECTEER * VAN user_source waar name = '
|
ALL_PROCEDURES | Geeft het subprogramma details zoals object_id, overbelastingsdetails, etc gemaakt door alle gebruikers. | SELECT * FROM all_procedures Waar object_name = '
|
USER_PROCEDURES | Geeft het subprogramma details zoals object_id, overbelastingsdetails, etc. aangemaakt door de huidige gebruiker. | SELECT * FROM gebruikersprocedures Waar object_naam = '
|
UTL-BESTAND - Een overzicht
UTL-bestand is het afzonderlijke hulpprogramma dat door Oracle wordt geleverd om speciale taken uit te voeren. Dit wordt voornamelijk gebruikt voor het lezen en schrijven van de besturingssysteembestanden vanuit PL / SQL-pakketten of subprogramma's. Het kreeg de afzonderlijke functies om de informatie te plaatsen en om de informatie uit bestanden te halen. Het maakt het ook mogelijk om in de oorspronkelijke tekenset te lezen / schrijven.
De programmeur kan dit gebruiken om besturingssysteembestanden van elk type te schrijven en het bestand wordt rechtstreeks naar de databaseserver geschreven. De naam en het directorypad worden vermeld op het moment van schrijven.
Overzicht
We hebben de pakketten nu in PL / SQL geleerd, en u zou nu in het volgende moeten kunnen werken.
- PL / SQL-pakketten en de bijbehorende componenten
- Kenmerken van pakketten
- Pakketelementen doorverwijzen en overbelasten
- Afhankelijkheden in pakketten beheren
- Pakketinformatie bekijken
- Wat is UTL-bestand