Oracle PL/SQL-pakke: Type, Specifikation, Body [Eksempel]

Hvad er pakken i Oracle?

PL/SQL-pakken er en logisk gruppering af et relateret underprogram (procedure/funktion) i et enkelt element. En pakke kompileres og gemmes som et databaseobjekt, der kan bruges senere.

Komponenter af pakker

PL/SQL-pakken har to komponenter.

  • Pakkespecifikation
  • Pakke Krop

Pakkespecifikation

Pakkespecifikationen består af en erklæring fra hele offentligheden variabler, markører, objekter, procedurer, funktioner og undtagelser.

Nedenfor er nogle få karakteristika ved pakkespecifikationen.

  • De elementer, der alle er deklareret i specifikationen, kan tilgås fra ydersiden af ​​pakken. Sådanne elementer er kendt som et offentligt element.
  • Pakkespecifikationen er et selvstændigt element, der betyder, at den kan eksistere alene uden pakketekst.
  • Når en pakke har henvist, oprettes en forekomst af pakken til den pågældende session.
  • Når instansen er oprettet til en session, er alle de pakkeelementer, der startes i den instans, gyldige indtil slutningen af ​​sessionen.

Syntaks

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

Ovenstående syntaks viser oprettelsen af ​​pakkespecifikation.

Pakke Krop

Den består af definitionen af ​​alle de elementer, der er til stede 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 pakkekropp.

  • Den skal indeholde definitioner for alle underprogrammer/markører der er angivet i specifikationen.
  • Det kan også have flere underprogrammer eller andre elementer, der ikke er deklareret i specifikationen. Disse kaldes private elementer.
  • Det er et pålideligt objekt, og det afhænger af pakkespecifikation.
  • Pakkelegemets tilstand bliver 'Ugyldig', hver gang specifikationen kompileres. Derfor skal den genkompileres hver gang efter kompileringen af ​​specifikationen.
  • De private elementer bør defineres først, før de bruges i pakkens krop.
  • Den første del af pakken er den globale deklarationsdel. Dette inkluderer variabler, markører og private elementer (forward-deklaration), der er synlige for hele pakken.
  • Den sidste del af pakken er Pakkeinitieringsdel, der udføres én gang, hver gang en pakke henvises første gang i sessionen.

Syntaks:

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>
  • Ovenstående syntaks viser oprettelsen af ​​pakketekst.

Nu skal vi se, hvordan man henviser til pakkeelementer i programmet.

Henvisende pakkeelementer

Når elementerne er erklæret og defineret i pakken, skal vi henvise elementerne til at bruge dem.

Alle de offentlige elementer i pakken kan henvises til ved at kalde pakkenavnet efterfulgt af elementnavnet adskilt af punktum dvs. . '.

Pakkens offentlige variabel 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, når en pakke henvises/kaldes i en session, vil der blive oprettet en ny instans for den pakke.

Oracle giver en facilitet til at initialisere pakkeelementer eller til at udføre enhver aktivitet på tidspunktet for oprettelsen af ​​denne instans gennem 'Pakkeinitialisering'.

Dette er intet andet end en udførelsesblok, der er skrevet i pakkens krop efter at have defineret alle pakkeelementerne. Denne blokering vil blive udført, hver gang en pakke henvises for første gang i sessionen.

Syntaks

Opret pakke i 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>
  • Ovenstående syntaks viser definitionen af ​​pakkeinitialisering i pakkens krop.

Fremsende erklæringer

Fremadgående erklæring/reference i pakken er intet andet end at deklarere de private elementer separat og definere det i den senere del af pakketeksten.

Private elementer kan kun henvises, hvis det allerede er deklareret i pakketeksten. Af denne grund anvendes fremadgående erklæring. Men det er ret usædvanligt at bruge, fordi private elementer i det meste af tiden erklæres og defineres i den første del af pakketeksten.

Fremsende erklæring er en mulighed, som Oracle, det er ikke obligatorisk, og at bruge og ikke bruge er op til programmørens krav.

Fremsende erklæringer

Syntaks:

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>

Ovenstående syntaks viser fremad-deklaration. De private elementer er deklareret separat i den forreste del af pakken, og de er blevet defineret i den senere del.

Brug af markører i pakken

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 den globale del af pakkens krop, vil markøren, når den er åbnet, fortsætte indtil slutningen af ​​sessionen.

Så man bør altid bruge markørattributterne '%ISOPEN' til at verificere cursorens tilstand, før den refereres.

Overloading (Overbelastning)

Overbelastning er konceptet med at have mange underprogrammer med samme navn. Disse underprogrammer vil adskille sig fra hinanden ved et antal parametre eller typer af parametre eller returtype, dvs. underprogram med samme navn, men med forskelligt antal parametre, forskellige typer parametre eller forskellige gentyper betragtes som overbelastning.

Dette er nyttigt, når mange underprogrammer skal udføre den samme opgave, men måden at kalde hver af dem på bør være forskellig. I dette tilfælde vil underprogramnavnet forblive det samme for alle, og parametrene vil blive ændret i henhold til kaldende sætning.

Eksempel 1: I dette eksempel skal vi oprette en pakke for at hente og indstille værdierne for medarbejderens oplysninger i 'emp'-tabellen. Get_record-funktionen returnerer posttype-outputtet for det givne medarbejdernummer, og set_record-proceduren vil indsætte posttypeposten i emp-tabellen.

Trin 1) Oprettelse af pakkespecifikation

Overloading (Overbelastning)

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

Kode Forklaring

  • Kodelinje 1-5: Oprettelse af pakkespecifikationen for guru99_get_set med én procedure og én funktion. Disse to er nu offentlige elementer af denne pakke.

Trin 2) Pakke indeholder Pakketekst, hvor alle procedurer og funktioners faktiske definition vil blive defineret. I dette trin oprettes Pakketekst.

Overloading (Overbelastning)

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

Kode Forklaring

  • Kodelinje 7: Oprettelse af pakketeksten.
  • Kodelinje 9-16: Definerer elementet 'set_record', der er erklæret i specifikationen. Dette er det samme som at definere den selvstændige procedure i PL/SQL.
  • Kodelinje 17-24: Definition af elementet 'get_record'. Det er det samme som at definere den selvstændige funktion.
  • Kodelinje 25-26: Definition af pakkens initialiseringsdel.

Trin 3) Oprettelse af en anonym blok for at indsætte og vise posterne ved at henvise til den ovenfor oprettede pakke.

Overloading (Overbelastning)

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

Kodeforklaring:

  • Kodelinje 34-37: Udfyldning af data for registreringstypevariabel i en anonym blok for at kalde 'set_record'-elementet i pakken.
  • Kodelinje 38: Kaldet er foretaget til 'set_record' af guru99_get_set-pakken. Nu er pakken instansieret, og den vil vare ved indtil slutningen af ​​sessionen.
  • Pakkeinitieringsdelen udføres, da dette er det første kald til pakken.
  • Posten er indsat af 'set_record'-elementet i tabellen.
  • Kodelinje 41: Kaldning af 'get_record'-elementet for at vise detaljerne for den indsatte medarbejder.
  • Pakken henvises for anden gang under 'get_record'-kaldet 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 den afhængighed, der skal tages hånd om.

  • En specifikation er et selvstændigt objekt.
  • En pakketekst er afhængig af specifikation.
  • Pakketekst kan kompileres separat. Hver gang specifikationen kompileres, skal kroppen genkompileres, da den bliver ugyldig.
  • Underprogrammet i pakkelegemet, der er afhængigt af et privat element, bør først defineres efter erklæringen af ​​det private element.
  • Databaseobjekterne, der henvises til i specifikationen og brødteksten, skal være i gyldig status på tidspunktet for pakkekompilering.

Pakkeinformation

Når pakkeoplysningerne er oprettet, er pakkeoplysningerne, såsom pakkekilde, underprogramdetaljer og overbelastningsdetaljer tilgængelige i Oracle datadefinitionstabeller.

Nedenstående tabel giver datadefinitionstabellen og de pakkeoplysninger, der er tilgængelige i tabellen.

Tabelnavn Produktbeskrivelse Query
ALLE_OBJEKT Giver detaljerne for pakken som object_id, creation_date, last_ddl_time osv. Den vil indeholde de objekter, der er oprettet af alle brugere. VÆLG * FRA alle_objekter hvor objektnavn =' '
USER_OBJECT Giver detaljerne for pakken som object_id, creation_date, last_ddl_time osv. Den vil indeholde de objekter, der er oprettet af den aktuelle bruger. VÆLG * FRA bruger_objekter hvor objektnavn =' '
ALLE_KILDE Giver kilden til de objekter, der er oprettet af alle brugere. SELECT * FROM all_source hvor navn=' '
USER_SOURCE Giver kilden til de objekter, der er oprettet af den aktuelle bruger. VÆLG * FRA bruger_kilde hvor navn=' '
ALLE_PROCEDURER Giver underprogrammet detaljer som object_id, overload detaljer osv. oprettet af alle brugere. VÆLG * FRA alle_procedurer
Hvor objektnavn=' '
USER_PROCEDURES Giver underprogrammet detaljer som object_id, overload detaljer osv. oprettet af den aktuelle bruger. VÆLG * FRA bruger_procedurer
Hvor objektnavn=' '

UTL-FIL – En oversigt

UTL File er den separate hjælpepakke leveret af Oracle at udføre særlige opgaver. Dette bruges hovedsageligt til at læse og skrive operativsystemfilerne fra PL/SQL-pakker eller underprogrammer. Den fik de separate funktioner til at lægge informationen og hente informationen 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 vil blive skrevet direkte til databaseserveren. Navnet og mappestien vil blive nævnt i skrivende stund.

Resumé

Vi har nu lært pakkerne ind PL / SQL, og du skulle nu være i stand til at arbejde i det følgende.

  • PL/SQL-pakker og dets komponenter
  • Karakteristika for pakker
  • Henvisning og overbelastning af pakkeelementer
  • Håndtering af afhængigheder i pakker
  • Se pakkeoplysninger
  • Hvad er UTL-fil