Oracle PL/SQL-pakket: type, specificatie, body [voorbeeld]
Wat zit er in? Oracle?
PL/SQL-pakket is een logische groepering van een gerelateerd subprogramma (procedure/functie) in één element. Een pakket wordt gecompileerd en opgeslagen als een databaseobject dat later kan worden gebruikt.
Componenten van pakketten
PL/SQL-pakket bestaat uit twee componenten.
- Pakket specificatie
- Pakket lichaam:
Pakket specificatie
Pakketspecificatie bestaat uit een verklaring van al het publiek 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 op zichzelf kan bestaan zonder de pakkettekst.
- Telkens wanneer een pakket heeft doorverwezen, wordt er voor die specifieke sessie een exemplaar van het pakket gemaakt.
- Nadat het exemplaar voor een sessie is aangemaakt, zijn alle pakketelementen die in dat exemplaar worden geïnitieerd geldig tot het einde van de sessie.
Syntaxis
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
De bovenstaande syntaxis toont het maken van pakketspecificaties.
Pakket lichaam:
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 de kenmerken van een pakketopbouw.
- Het moet definities bevatten voor alle subprogramma's/cursors die in de specificatie zijn aangegeven.
- 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 pakkettekst wordt 'Invalid' 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 aangiftedeel. Dit omvat variabelen, cursors en privé-elementen (forward-declaratie) die zichtbaar zijn voor het hele pakket.
- Het laatste deel van het pakket is het pakketinitialisatiedeel dat één keer wordt uitgevoerd telkens wanneer voor de eerste keer in de sessie naar een pakket wordt verwezen.
Syntax:
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>
- De bovenstaande syntaxis toont het maken van de pakkettekst.
Nu gaan we kijken hoe we naar pakketelementen in het programma kunnen verwijzen.
Verwijzende pakketelementen
Zodra de elementen in het pakket zijn gedeclareerd en gedefinieerd, moeten we naar de elementen verwijzen om ze te gebruiken.
Er kan naar alle openbare elementen van het pakket worden verwezen door de pakketnaam aan te roepen, gevolgd door de elementnaam, gescheiden door een punt, bijvoorbeeld ' . '.
De publieke variabele van het pakket kan ook op dezelfde manier worden gebruikt om waarden eraan toe te wijzen en op te halen, bijvoorbeeld ' . '.
Pakket maken in PL/SQL
In PL/SQL wordt telkens wanneer een pakket wordt doorverwezen/aangeroepen tijdens een sessie, een nieuw exemplaar voor dat pakket gemaakt.
Oracle biedt een mogelijkheid om pakketelementen te initialiseren of om enige activiteit uit te voeren op het moment dat deze instantie 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 telkens wanneer een pakket voor de eerste keer in de sessie wordt doorverwezen.
Syntaxis
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGINE <Package Initialization> END <package_name>
- De bovenstaande syntaxis toont de definitie van pakketinitialisatie in de pakketbody.
Verklaringen doorsturen
De voorwaartse declaratie/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 pakkettekst.
Er kan alleen naar privé-elementen worden verwezen als dit al in de pakkettekst is aangegeven. Om deze reden wordt gebruik gemaakt van voorwaartse aangifte. Maar het is nogal ongebruikelijk om te gebruiken, omdat privé-elementen meestal worden gedeclareerd en gedefinieerd in het eerste deel van de pakkettekst.
Voorwaartse aangifte is een optie van Oracle, het is niet verplicht en het gebruiken en niet gebruiken is afhankelijk van de vereisten van de programmeur.
Syntax:
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>
De bovenstaande syntaxis toont forward declaration. De private elementen worden apart gedeclareerd in het forward gedeelte van het pakket, en ze zijn gedefinieerd in het latere gedeelte.
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 pakketbody, zal de eenmaal geopende cursor blijven bestaan tot het einde van de sessie.
Je moet dus altijd de cursorattributen '%ISOPEN' gebruiken om de status van de cursor te verifiëren voordat je ernaar verwijst.
Overbelasting
Overbelasting is het concept van het hebben van veel subprogramma's met dezelfde naam. Deze subprogramma's zullen van elkaar verschillen door een aantal parameters of typen parameters of retourtype. Dat wil zeggen subprogramma's met dezelfde naam maar met een verschillend aantal parameters, een ander type parameters of een ander hertype worden als overbelasting beschouwd.
Dit is handig als veel subprogramma's dezelfde taak moeten uitvoeren, maar de manier waarop ze allemaal worden aangeroepen anders moet zijn. In dit geval blijft de naam van het subprogramma voor iedereen hetzelfde en worden de parameters gewijzigd volgens de aanroepende instructie.
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 get_record-functie retourneert de recordtype-uitvoer voor het opgegeven werknemersnummer, en de set_record-procedure voegt het recordtype-record in de emp-tabel in.
Stap 1) Pakketspecificatie maken
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: /
Output:
Package created
Code Uitleg
- 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) Het pakket bevat de hoofdtekst van het pakket, waarin alle procedures en functies feitelijk worden gedefinieerd. In deze stap wordt de pakkettekst gemaakt.
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: /
Output:
Package body created
Code Uitleg
- Coderegel 7: De pakkettekst maken.
- Coderegel 9-16: Het definiëren van het element 'set_record' dat in de specificatie wordt gedeclareerd. Dit is hetzelfde als het definiëren van de zelfstandige procedure in PL/SQL.
- Coderegel 17-24: Het definiëren van het element 'get_record'. Het is hetzelfde als het definiëren van de zelfstandige functie.
- Coderegel 25-26: Het pakketinitialisatiegedeelte definiëren.
Stap 3) Een anoniem blok maken om de records in te voegen en weer te geven door te verwijzen naar het hierboven gemaakte pakket.
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: /
Output:
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
Code Verklaring:
- Coderegel 34-37: Het invullen 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 een oproep gedaan 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 pakketinitialisatiegedeelte wordt uitgevoerd omdat dit de eerste aanroep van het pakket is.
- Het record wordt door het element 'set_record' in de tabel ingevoegd.
- Coderegel 41: Het 'get_record'-element aanroepen om de gegevens van de ingevoegde werknemer weer te geven.
- Het pakket wordt tijdens de 'get_record'-aanroep voor de tweede keer naar het pakket verwezen. Maar het initialisatiegedeelte wordt deze keer niet uitgevoerd omdat het pakket al in deze sessie is geïnitialiseerd.
- Coderegel 42-45: Afdrukken van de gegevens van de werknemer.
Afhankelijkheid in pakketten
Omdat het pakket de logische groepering is van gerelateerde dingen, heeft het enkele afhankelijkheden. Hieronder staan de afhankelijkheden waar rekening mee moet worden gehouden.
- Een Specificatie is een op zichzelf staand object.
- Een pakketopbouw is afhankelijk van de specificatie.
- Pakketbody kan afzonderlijk worden samengesteld. Telkens wanneer de specificatie wordt gecompileerd, moet de hoofdtekst opnieuw worden gecompileerd, omdat deze ongeldig wordt.
- Het subprogramma in de hoofdtekst van het pakket dat afhankelijk is van een privé-element mag 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.
Pakketinformatie
Zodra de pakketinformatie is gemaakt, zijn de pakketgegevens zoals de pakketbron, subprogrammadetails en overbelastingsdetails beschikbaar in de Oracle gegevensdefinitietabellen.
Onderstaande tabel geeft de gegevensdefinitietabel en de pakketinformatie die beschikbaar is in de tabel.
Tafel naam | Beschrijving | Vraag |
---|---|---|
ALL_OBJECT | Geeft de details van het pakket, zoals object_id, creation_date, last_ddl_time, etc. Het bevat de objecten die door alle gebruikers zijn gemaakt. | SELECT * FROM all_objects waarbij objectnaam =' ' |
GEBRUIKER_OBJECT | Geeft de details van het pakket, zoals object_id, creation_date, last_ddl_time, etc. Het bevat de objecten die door de huidige gebruiker zijn gemaakt. | SELECTEER * VAN user_objects waarbij object_name =' ' |
ALLE_BRON | Geeft de bron van de objecten die door alle gebruikers zijn gemaakt. | SELECT * FROM all_source waarbij naam=' ' |
GEBRUIKER_SOURCE | Geeft de bron van de objecten die door de huidige gebruiker zijn gemaakt. | SELECT * FROM user_source waarbij naam=' ' |
ALLE_PROCEDURES | Geeft de subprogrammadetails zoals object_id, overloaddetails, etc. die door alle gebruikers zijn gemaakt. | SELECTEER * UIT alle_procedures Waar objectnaam=' ' |
USER_PROCEDURES | Geeft details van het subprogramma, zoals object_id, overload details, etc., dat door de huidige gebruiker is gemaakt. | SELECTEER * VAN user_procedures Waar objectnaam=' ' |
UTL-BESTAND – Een overzicht
UTL-bestand is het afzonderlijke hulpprogrammapakket dat wordt geleverd door Oracle om speciale taken uit te voeren. Dit wordt voornamelijk gebruikt voor het lezen en schrijven van de bestanden van het besturingssysteem van PL/SQL-pakketten of subprogramma's. Het heeft de aparte functies om de informatie te plaatsen en om de informatie uit bestanden te halen. Het staat ook toe om te lezen/schrijven in de native tekenset.
De programmeur kan dit gebruiken om besturingssysteembestanden van elk type te schrijven en het bestand wordt direct naar de databaseserver geschreven. De naam en het directorypad worden vermeld op het moment van schrijven.
Samenvatting
Inmiddels hebben we de pakketten ingeleerd PL / SQL, en nu zou u in staat moeten zijn om met het volgende te werken.
- PL/SQL-pakketten en zijn componenten
- Kenmerken van pakketten
- Pakketelementen doorverwijzen en overbelasten
- Afhankelijkheden in pakketten beheren
- Pakketinformatie bekijken
- Wat is een UTL-bestand