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

Hva er pakken i Oracle?

PL/SQL-pakken er en logisk gruppering av et relatert underprogram (prosedyre/funksjon) i et enkelt element. En pakke kompileres og lagres som et databaseobjekt som kan brukes senere.

Komponenter av pakker

PL/SQL-pakken har to komponenter.

  • Pakkespesifikasjon
  • Pakkekropp

Pakkespesifikasjon

Pakkespesifikasjonen består av en erklæring fra all offentlighet variabler, markører, objekter, prosedyrer, funksjoner og unntak.

Nedenfor er noen av egenskapene til pakkespesifikasjonen.

  • Elementene som alle er deklarert i spesifikasjonen kan nås fra utsiden av pakken. Slike elementer er kjent som et offentlig element.
  • Pakkespesifikasjonen er et frittstående element som betyr at den kan eksistere alene uten pakketekst.
  • Hver gang en pakke har henvist, opprettes en forekomst av pakken for den aktuelle økten.
  • Etter at forekomsten er opprettet for en økt, er alle pakkeelementene som er initiert i den forekomsten gyldige til slutten av økten.

syntax

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

Syntaksen ovenfor viser opprettelsen av pakkespesifikasjonen.

Pakkekropp

Den består av definisjonen av alle elementene som er til stede i pakkespesifikasjonen. Den kan også ha en definisjon av elementer som ikke er deklarert i spesifikasjonen, disse elementene kalles private elementer og kan kun kalles fra innsiden av pakken.

Nedenfor er kjennetegn ved en pakkekropp.

  • Den skal inneholde definisjoner for alle underprogrammene/pekere som er deklarert i spesifikasjonen.
  • Den kan også ha flere underprogrammer eller andre elementer som ikke er deklarert i spesifikasjonen. Disse kalles private elementer.
  • Det er et pålitelig objekt, og det avhenger av pakkespesifikasjonen.
  • Tilstanden til pakketeksten blir "Ugyldig" hver gang spesifikasjonen kompileres. Derfor må den kompileres på nytt hver gang etter kompileringen av spesifikasjonen.
  • De private elementene bør defineres først før de brukes i pakketeksten.
  • Den første delen av pakken er den globale deklarasjonsdelen. Dette inkluderer variabler, markører og private elementer (forward declaration) som er synlig for hele pakken.
  • Den siste delen av pakken er pakkeinitieringsdelen som kjøres én gang hver gang en pakke henvises første gang i økten.

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>
  • Syntaksen ovenfor viser opprettelsen av pakketeksten.

Nå skal vi se hvordan vi refererer til pakkeelementer i programmet.

Refererende pakkeelementer

Når elementene er deklarert og definert i pakken, må vi henvise elementene til å bruke dem.

Alle de offentlige elementene i pakken kan henvises til ved å kalle pakkenavnet etterfulgt av elementnavnet atskilt med punktum, dvs. ' . '.

Den offentlige variabelen til pakken kan også brukes på samme måte for å tildele og hente verdier fra dem, dvs. . '.

Opprett pakke i PL/SQL

I PL/SQL når en pakke henvises/kalles i en økt, vil en ny forekomst bli opprettet for den pakken.

Oracle gir en mulighet for å initialisere pakkeelementer eller å utføre en hvilken som helst aktivitet på tidspunktet for opprettelse av denne forekomsten gjennom "Pakkeinitialisering".

Dette er ikke annet enn en utførelsesblokk som skrives i pakketeksten etter å ha definert alle pakkeelementene. Denne blokkeringen vil bli utført hver gang en pakke henvises for første gang i økten.

syntax

Opprett 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>
  • Syntaksen ovenfor viser definisjonen av pakkeinitialisering i pakketeksten.

Videresend erklæringer

Videresend erklæring/referanse i pakken er ikke annet enn å deklarere de private elementene separat og definere det i den senere delen av pakketeksten.

Private elementer kan kun henvises hvis det allerede er deklarert i pakketeksten. Av denne grunn brukes fremsettelseserklæring. Men det er ganske uvanlig å bruke fordi i det meste av tiden blir private elementer deklarert og definert i den første delen av pakketeksten.

Forward erklæring er et alternativ gitt av Oracle, det er ikke obligatorisk og bruk og ikke bruk er opp til programmererens krav.

Videresend 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>

Ovennevnte syntaks viser fremad deklarasjon. De private elementene er deklarert separat i den fremre delen av pakken, og de er definert i den senere delen.

Markørbruk i pakken

I motsetning til andre elementer må man være forsiktig med å bruke markører inne i pakken.

Hvis markøren er definert i pakkespesifikasjonen eller i den globale delen av pakketeksten, vil markøren når den er åpnet vedvare til slutten av økten.

Så man bør alltid bruke markørattributtene '%ISOPEN' for å bekrefte statusen til markøren før du refererer den.

Overbelastning

Overbelastning er konseptet med å ha mange underprogrammer med samme navn. Disse underprogrammene vil avvike fra hverandre ved en rekke parametere eller typer parametere eller returtype, dvs. underprogram med samme navn, men med forskjellig antall parametere, forskjellige typer parametere eller forskjellige omtyper anses som overbelastning.

Dette er nyttig når mange underprogrammer må gjøre samme oppgave, men måten å kalle hver av dem på bør være forskjellig. I dette tilfellet vil underprogramnavnet beholdes det samme for alle, og parametrene vil bli endret i henhold til calling statement.

Eksempel 1: I dette eksemplet skal vi lage en pakke for å hente og sette verdiene til ansattes informasjon i 'emp'-tabellen. Get_record-funksjonen vil returnere posttypeutgangen for det gitte ansattnummeret, og set_record-prosedyren vil sette inn posttypeposten i emp-tabellen.

Trinn 1) Oppretting av pakkespesifikasjoner

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:
/

Utgang:

Package created

Kode Forklaring

  • Kodelinje 1-5: Opprette pakkespesifikasjonen for guru99_get_set med én prosedyre og én funksjon. Disse to er nå offentlige deler av denne pakken.

Trinn 2) Pakken inneholder Pakketekst, hvor alle prosedyrer og funksjoner faktisk definisjon vil bli definert. I dette trinnet opprettes Pakketekst.

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:
/

Utgang:

Package body created

Kode Forklaring

  • Kodelinje 7: Opprette pakketeksten.
  • Kodelinje 9-16: Definerer elementet 'set_record' som er deklarert i spesifikasjonen. Dette er det samme som å definere den frittstående prosedyren i PL/SQL.
  • Kodelinje 17-24: Definere elementet 'get_record'. Det er det samme som å definere den frittstående funksjonen.
  • Kodelinje 25-26: Definere pakkens initialiseringsdel.

Trinn 3) Opprette en anonym blokk for å sette inn og vise postene ved å referere til den ovenfor opprettede pakken.

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:
/

Utgang:

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: Fyller dataene for posttypevariabelen i en anonym blokk for å kalle 'set_record'-elementet i pakken.
  • Kodelinje 38: Anrop er gjort til 'set_record' av guru99_get_set-pakken. Nå er pakken instansiert og den vil vare til slutten av økten.
  • Pakkeinitieringsdelen utføres siden dette er det første kallet til pakken.
  • Posten er satt inn av 'set_record'-elementet i tabellen.
  • Kodelinje 41: Kalle opp 'get_record'-elementet for å vise detaljene til den innsatte ansatte.
  • Pakken blir henvist for andre gang under 'get_record'-kallet til pakken. Men initialiseringsdelen blir ikke utført denne gangen da pakken allerede er initialisert i denne økten.
  • Kodelinje 42-45: Skriver ut de ansattes detaljer.

Avhengighet i pakker

Siden pakken er den logiske grupperingen av relaterte ting, har den noen avhengigheter. Følgende er avhengigheten som skal ivaretas.

  • En spesifikasjon er et frittstående objekt.
  • En pakkekropp er avhengig av spesifikasjonen.
  • Pakketeksten kan kompileres separat. Hver gang spesifikasjonen kompileres, må kroppen kompileres på nytt, da den blir ugyldig.
  • Underprogrammet i pakkelegemet som er avhengig av et privat element, bør kun defineres etter erklæringen av det private elementet.
  • Databaseobjektene som henvises til i spesifikasjonen og kroppen må være i gyldig status på tidspunktet for pakkekompilering.

Pakkeinformasjon

Når pakkeinformasjonen er opprettet, er pakkeinformasjonen som pakkekilde, underprogramdetaljer og overbelastningsdetaljer tilgjengelig i Oracle datadefinisjonstabeller.

Tabellen nedenfor gir datadefinisjonstabellen og pakkeinformasjonen som er tilgjengelig i tabellen.

Tabellnavn Tekniske beskrivelser Query
ALL_OBJECT Gir detaljene til pakken som object_id, creation_date, last_ddl_time, etc. Den vil inneholde objektene som er opprettet av alle brukere. VELG * FRA alle_objekter der objektnavn =' '
USER_OBJECT Gir detaljene til pakken som object_id, creation_date, last_ddl_time, etc. Den vil inneholde objektene som er opprettet av gjeldende bruker. SELECT * FROM user_objects der objektnavn =' '
ALL_SOURCE Gir kilden til objektene som er opprettet av alle brukere. SELECT * FROM all_source hvor navn=' '
USER_SOURCE Gir kilden til objektene opprettet av gjeldende bruker. SELECT * FROM user_source hvor navn=' '
ALLE_PROSEDYRER Gir underprogrammet detaljer som object_id, overload detaljer, etc opprettet av alle brukere. VELG * FRA alle_prosedyrer
Hvor objektnavn=' '
USER_PROCEDURES Gir underprogrammet detaljer som object_id, overload detaljer, etc. opprettet av gjeldende bruker. VELG * FRA bruker_prosedyrer
Hvor objektnavn=' '

UTL-FIL – En oversikt

UTL File er den separate verktøypakken levert av Oracle å utføre spesielle oppgaver. Dette brukes hovedsakelig til å lese og skrive operativsystemfilene fra PL/SQL-pakker eller underprogrammer. Den fikk de separate funksjonene for å sette informasjonen og å hente informasjonen fra filer. Den tillater også å lese/skrive i det opprinnelige tegnsettet.

Programmereren kan bruke denne til å skrive operativsystemfiler av enhver type, og filen vil bli skrevet direkte til databaseserveren. Navnet og katalogbanen vil bli nevnt når du skriver.

Sammendrag

Vi har nå lært pakkene inn PL / SQL, og du skal nå kunne jobbe i følgende.

  • PL/SQL-pakker og dets komponenter
  • Kjennetegn på pakker
  • Henvisning og overbelastning av pakkeelementer
  • Administrere avhengigheter i pakker
  • Viser pakkeinformasjon
  • Hva er UTL-fil