Hvad er pakke i Oracle?
PL / SQL-pakke er en logisk gruppering af et relateret underprogram (procedure / funktion) i et enkelt element. En pakke kompileres og lagres som et databaseobjekt, der kan bruges senere.
I denne vejledning lærer du-
- Komponenter i pakker
- Pakke specifikation
- Pakkehus
- Henvisende pakkeelementer
- Opret pakke i PL / SQL
- Fremadrettede erklæringer
- Markørbrug i pakke
- Overbelastning
- Afhængighed i pakker
- Pakkeoplysninger
- UTL FILE - En oversigt
Komponenter i pakker
PL / SQL-pakke har to komponenter.
- Pakke specifikation
- Pakkehus
Pakke specifikation
Pakkespecifikation består af en erklæring af alle de offentlige variabler, markører, objekter, procedurer, funktioner og undtagelser.
Nedenfor er nogle få egenskaber ved pakke-specifikationen.
- De elementer, der alle er deklareret i specifikationen, kan tilgås uden for pakken. Sådanne elementer er kendt som et offentligt element.
- Pakkespecifikationen er et enkeltstående element, der betyder, at den kan eksistere alene uden pakkeorgan.
- Hver gang en pakke har henvist oprettes der en forekomst af pakken til den pågældende session.
- Når forekomsten er oprettet til en session, er alle pakkeelementerne, der initieres i den forekomst, gyldige indtil slutningen af sessionen.
Syntaks
CREATE [OR REPLACE] PACKAGEIS … END
Ovenstående syntaks viser oprettelsen af pakkespecifikation.
Pakkehus
Den består af definitionen af alle de elementer, der findes i pakkespecifikationen. Det kan også have en definition af elementer, der ikke er deklareret i specifikationen, disse elementer kaldes private elementer og kan kun kaldes inde fra pakken.
Nedenfor er karakteristika for en pakkehus.
- Den skal indeholde definitioner for alle de underprogrammer / markører, der er erklæret i specifikationen.
- Det kan også have flere underprogrammer eller andre elementer, der ikke er angivet i specifikationen. Disse kaldes private elementer.
- Det er et pålideligt objekt, og det afhænger af pakkespecifikationen.
- Pakkens krops tilstand bliver 'Ugyldig', hver gang specifikationen kompileres. Derfor skal den kompileres igen hver gang efter udarbejdelsen af specifikationen.
- De private elementer skal defineres først, før de bruges i emballagen.
- Den første del af pakken er den globale erklæringsdel. Dette inkluderer variabler, markører og private elementer (forward declaration), der er synlige for hele pakken.
- Den sidste del af pakken er pakkeinitialiseringsdel, der udføres en gang, hver gang en pakke henvises første gang i sessionen.
Syntaks:
CREATE [OR REPLACE] PACKAGE BODYIS . END
- Ovenstående syntaks viser oprettelsen af pakkeindholdet.
Nu skal vi se, hvordan der henvises til pakkeelementer i programmet.
Henvisende pakkeelementer
Når elementerne er deklareret og defineret i pakken, skal vi henvise elementerne for at bruge dem.
Alle de offentlige elementer i pakken kan henvises ved at kalde pakkenavnet efterfulgt af elementnavnet adskilt af periode, dvs. '
Den offentlige variabel i pakken kan også bruges på samme måde til at tildele og hente værdier fra dem, dvs. '
Opret pakke i PL / SQL
I PL / SQL, hver gang en pakke henvises / kaldes i en session, oprettes der en ny forekomst for den pakke.
Oracle giver mulighed for at initialisere pakkeelementer eller udføre enhver aktivitet på tidspunktet for oprettelsen af denne instans gennem 'Package Initialization'.
Dette er intet andet end en eksekveringsblok, der er skrevet i pakkeelementet efter at have defineret alle pakkeelementerne. Denne blok udføres, hver gang en pakke henvises for første gang i sessionen.
Syntaks
CREATE [OR REPLACE] PACKAGE BODYIS .BEGINE END
- Ovenstående syntaks viser definitionen af pakkeinitialisering i pakkeindholdet.
Fremadrettede erklæringer
Fremadrettet erklæring / reference i pakken er intet andet end at erklære de private elementer separat og definere det i den senere del af pakkeorganet.
Private elementer kan kun henvises, hvis de allerede er deklareret i pakkeorganet. Af denne grund anvendes fremsendelseserklæring. Men det er ret usædvanligt at bruge, fordi det meste af tiden private elementer erklæres og defineres i den første del af pakkeindholdet.
Videresendelseserklæring er en mulighed leveret af Oracle, det er ikke obligatorisk, og brug og ikke brug er op til programmørens krav.
Syntaks:
CREATE [OR REPLACE] PACKAGE BODYIS … … .BEGIN ;END
Ovenstående syntaks viser fremadrettet erklæring. De private elementer erklæres særskilt i den forreste del af pakken, og de er defineret i den senere del.
Markørbrug i pakke
I modsætning til andre elementer skal man være forsigtig med at bruge markører inde i pakken.
Hvis markøren er defineret i pakkespecifikationen eller i en global del af pakkeindholdet, vil markøren, når den er åbnet, fortsætte indtil slutningen af sessionen.
Så man skal altid bruge markørattributterne '% ISOPEN' til at verificere markørens tilstand, før man henviser til den.
Overbelastning
Overbelastning er begrebet at have mange underprogrammer med samme navn. Disse underprogrammer vil være forskellige fra hinanden ved hjælp af et antal parametre eller typer af parametre eller returtype, dvs. underprogram med samme navn, men med forskelligt antal parametre, forskellige typer parametre eller anden retype betragtes som overbelastning.
Dette er nyttigt, når mange underprogrammer skal udføre den samme opgave, men måden at ringe til hver af dem skal være forskellig. I dette tilfælde holdes underprogramnavnet det samme for alle, og parametrene ændres som pr. Opkaldserklæring.
Eksempel 1 : I dette eksempel skal vi oprette en pakke til at hente og indstille værdierne for medarbejderens information i 'emp' -tabellen. Funktionen get_record returnerer output for posttypen for det givne medarbejdernummer, og set_record-proceduren indsætter recordtypeposten i emp-tabellen.
Trin 1) Oprettelse af pakkespecifikation
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:/
Produktion:
Package created
Kode Forklaring
- Kodelinje 1-5 : Oprettelse af pakkespecifikationen for guru99_get_set med en procedure og en funktion. Disse to er nu offentlige elementer i denne pakke.
Trin 2) Pakke indeholder pakkeelement, hvor alle faktiske definitioner af procedurer og funktioner vil blive defineret. I dette trin oprettes pakkeelement.
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:/
Produktion:
Package body created
Kode Forklaring
- Kodelinje 7 : Oprettelse af pakkeindholdet.
- Kodelinje 9-16 : Definition af elementet 'set_record', der er angivet i specifikationen. Dette er det samme som at definere den enkeltstående procedure i PL / SQL.
- Kodelinje 17-24: Definition af elementet 'get_record'. Det er det samme som at definere den enkeltstående funktion.
- Kodelinje 25-26: Definition af pakkeinitialiseringsdelen.
Trin 3) Oprettelse af en anonym blokering til indsættelse og visning af poster ved at henvise til ovenstående oprettede pakke.
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:/
Produktion:
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
Kode Forklaring:
- Kodelinje 34-37: Udfyldning af data for variabel for recordtype i en anonym blokering for at kalde 'set_record' element i pakken.
- Kodelinje 38: Der er foretaget opkald til 'set_record' for pakken guru99_get_set. Nu er pakken instantieret, og den fortsætter indtil slutningen af sessionen.
- Pakkeinitialiseringsdelen udføres, da dette er det første opkald til pakken.
- Posten indsættes af 'set_record' elementet i tabellen.
- Kodelinje 41: Opkald til 'get_record' elementet for at få vist detaljerne for den indsatte medarbejder.
- Pakken henvises til anden gang under 'get_record' opkaldet til pakken. Men initialiseringsdelen udføres ikke denne gang, da pakken allerede er initialiseret i denne session.
- Kodelinje 42-45: Udskrivning af medarbejderoplysninger.
Afhængighed i pakker
Da pakken er den logiske gruppering af relaterede ting, har den nogle afhængigheder. Følgende er afhængigheden, der skal tages hånd om.
- En specifikation er et enkeltstående objekt.
- En pakkeorgan afhænger af specifikationen.
- Pakkehus kan kompileres separat. Hver gang specifikation kompileres, skal kroppen kompileres igen, da den bliver ugyldig.
- Underprogrammet i pakkeelement, der er afhængigt af et privat element, bør kun defineres efter erklæringen om det private element.
- De databaseobjekter, der henvises til i specifikationen og kroppen, skal have en gyldig status på tidspunktet for pakkesammensætningen.
Pakkeoplysninger
Når pakkeoplysningerne er oprettet, er pakkeoplysningerne såsom pakke kilde, underprogram detaljer og overbelastnings detaljer tilgængelige i Oracle datadefinitionstabeller.
Nedenstående tabel giver datadefinitionstabellen og den pakkeinformation, der er tilgængelig i tabellen.
Tabelnavn | Beskrivelse | Forespørgsel |
ALL_OBJECT | Giver detaljerne i pakken som object_id, creation_date, last_ddl_time osv. Den indeholder de objekter, der er oprettet af alle brugere. | VÆLG * FRA all_objects hvor object_name = '
|
USER_OBJECT | Giver detaljerne i pakken som object_id, creation_date, last_ddl_time osv. Den indeholder de objekter, der er oprettet af den aktuelle bruger. | VÆLG * FRA user_objects hvor object_name = '
|
ALL_SOURCE | Giver kilden til de objekter, der er oprettet af alle brugere. | VÆLG * FRA all_source hvor name = '
|
USER_SOURCE | Giver kilden til de objekter, der er oprettet af den aktuelle bruger. | VÆLG * FRA user_source hvor name = '
|
ALL_PROCEDURER | Giver underprogramoplysninger som objekt_id, overbelastningsoplysninger osv. Oprettet af alle brugere. | VÆLG * FRA all_procedures Hvor object_name = '
|
USER_PROCEDURES | Giver underprogramoplysninger som objekt_id, detaljer om overbelastning osv. Oprettet af den aktuelle bruger. | VÆLG * FRA user_procedures Hvor object_name = '
|
UTL FILE - En oversigt
UTL File er den separate hjælpepakke, der leveres af Oracle til at udføre specielle opgaver. Dette bruges hovedsageligt til læsning og skrivning af operativsystemfiler fra PL / SQL-pakker eller underprogrammer. Det fik de separate funktioner til at placere oplysningerne og få oplysningerne fra filer. Det giver også mulighed for at læse / skrive i det oprindelige tegnsæt.
Programmøren kan bruge dette til at skrive operativsystemfiler af enhver type, og filen skrives direkte til databaseserveren. Navnet og katalogstien vil blive nævnt i skrivende stund.
Resumé
Vi har nu lært pakkerne i PL / SQL, og du skal nu kunne arbejde i det følgende.
- PL / SQL-pakker og dets komponenter
- Kendetegn ved pakker
- Henvisning og overbelastning af pakkeelementer
- Håndtering af afhængigheder i pakker
- Visning af pakkeoplysninger
- Hvad er UTL File