Oracle PL/SQL-paket: Typ, Specifikation, Kropp [Exempel]

Vad är paketet i Oracle?

PL/SQL-paketet är en logisk gruppering av ett relaterat underprogram (procedur/funktion) till ett enda element. Ett paket kompileras och lagras som ett databasobjekt som kan användas senare.

Komponenter i paket

PL/SQL-paketet har två komponenter.

  • Paketspecifikation
  • Paketkropp

Paketspecifikation

Paketspecifikationen består av en deklaration av all allmänhet variabler, markörer, objekt, procedurer, funktioner och undantag.

Nedan finns några egenskaper hos paketspecifikationen.

  • Elementen som alla deklareras i specifikationen kan nås från utsidan av paketet. Sådana element är kända som ett offentligt element.
  • Paketspecifikationen är ett fristående element som betyder att den kan existera ensam utan paketets innehåll.
  • Närhelst ett paket har hänvisat skapas en instans av paketet för just den sessionen.
  • Efter att instansen har skapats för en session är alla paketelement som initieras i den instansen giltiga till slutet av sessionen.

syntax

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

Ovanstående syntax visar skapandet av paketspecifikation.

Paketkropp

Den består av definitionen av alla element som finns i paketspecifikationen. Den kan också ha en definition av element som inte deklareras i specifikationen, dessa element kallas privata element och kan endast anropas inifrån paketet.

Nedan finns egenskaper hos en förpackningskropp.

  • Den bör innehålla definitioner för alla underprogram/markörer som har deklarerats i specifikationen.
  • Den kan också ha fler underprogram eller andra element som inte deklareras i specifikationen. Dessa kallas privata element.
  • Det är ett pålitligt objekt, och det beror på paketspecifikation.
  • Tillståndet för paketkroppen blir "Ogiltig" när specifikationen kompileras. Därför måste den kompileras om varje gång efter sammanställningen av specifikationen.
  • De privata elementen bör definieras först innan de används i paketets kropp.
  • Den första delen av paketet är den globala deklarationsdelen. Detta inkluderar variabler, markörer och privata element (forward declaration) som är synliga för hela paketet.
  • Den sista delen av paketet är paketinitieringsdelen som körs en gång när ett paket hänvisas första gången i sessionen.

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>
  • Ovanstående syntax visar skapandet av paketets kropp.

Nu ska vi se hur man hänvisar till paketelement i programmet.

Refererande paketelement

När elementen är deklarerade och definierade i paketet måste vi hänvisa elementen för att använda dem.

Alla publika element i paketet kan refereras genom att anropa paketnamnet följt av elementnamnet avgränsat med punkt, dvs. . '.

Paketets publika variabel kan också användas på samma sätt för att tilldela och hämta värden från dem, dvs. . '.

Skapa paket i PL/SQL

I PL/SQL närhelst ett paket hänvisas/anropas i en session kommer en ny instans att skapas för det paketet.

Oracle tillhandahåller en möjlighet att initiera paketelement eller att utföra någon aktivitet vid tidpunkten för den här instansen skapas genom "Paketinitiering".

Detta är inget annat än ett exekveringsblock som skrivs i paketets kropp efter att ha definierat alla paketelement. Detta block kommer att exekveras när ett paket hänvisas för första gången i sessionen.

syntax

Skapa paket 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>
  • Ovanstående syntax visar definitionen av paketinitiering i paketets kropp.

Vidarebefordra deklarationer

Vidarebefordran/referens i paketet är inget annat än att deklarera de privata elementen separat och definiera det i den senare delen av paketets innehåll.

Privata element kan endast hänvisas om det redan är deklarerat i paketets innehåll. Av denna anledning används framåtriktad deklaration. Men det är ganska ovanligt att använda eftersom privata element för det mesta deklareras och definieras i den första delen av paketets kropp.

Forward deklaration är ett alternativ som tillhandahålls av Oracle, det är inte obligatoriskt och att använda och inte använda är upp till programmerarens krav.

Vidarebefordra deklarationer

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>

Ovanstående syntax visar framåtriktad deklaration. De privata elementen deklareras separat i den främre delen av paketet, och de har definierats i den senare delen.

Användning av markörer i paketet

Till skillnad från andra element måste man vara försiktig med att använda markörer inuti paketet.

Om markören är definierad i paketspecifikationen eller i den globala delen av paketets kropp, kommer markören en gång öppnad att kvarstå till slutet av sessionen.

Så man bör alltid använda markörattributen '%ISOPEN' för att verifiera markörens tillstånd innan den hänvisas.

Överbelastning

Överbelastning är konceptet med att ha många underprogram med samma namn. Dessa underprogram kommer att skilja sig från varandra genom ett antal parametrar eller typer av parametrar eller returtyp, dvs underprogram med samma namn men med olika antal parametrar, olika typer av parametrar eller olika omtyp anses som överbelastning.

Detta är användbart när många underprogram behöver göra samma uppgift, men sättet att anropa var och en av dem bör vara olika. I detta fall kommer underprogramnamnet att vara detsamma för alla och parametrarna kommer att ändras enligt anropssatsen.

Exempelvis 1: I det här exemplet kommer vi att skapa ett paket för att hämta och ställa in värdena för anställdas information i 'emp'-tabellen. Get_record-funktionen returnerar posttypens utdata för det givna anställdsnumret, och set_record-proceduren kommer att infoga posttypens post i emp-tabellen.

Steg 1) Skapande av paketspecifikationer

Överbelastning

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

Produktion:

Package created

Kodförklaring

  • Kodrad 1-5: Skapar paketspecifikationen för guru99_get_set med en procedur och en funktion. Dessa två är nu offentliga delar av detta paket.

Steg 2) Paketet innehåller paketets kropp, där alla procedurer och funktioners faktiska definition kommer att definieras. I det här steget skapas Package Body.

Överbelastning

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

Produktion:

Package body created

Kodförklaring

  • Kodrad 7: Skapar paketets kropp.
  • Kodrad 9-16: Definierar elementet 'set_record' som deklareras i specifikationen. Detta är samma sak som att definiera den fristående proceduren i PL/SQL.
  • Kodrad 17-24: Definiera elementet 'get_record'. Det är samma sak som att definiera den fristående funktionen.
  • Kodrad 25-26: Definiera paketinitieringsdelen.

Steg 3) Skapa ett anonymt block för att infoga och visa posterna genom att hänvisa till ovan skapade paket.

Överbelastning

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

Produktion:

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

Kodförklaring:

  • Kodrad 34-37: Fylla på data för posttypvariabeln i ett anonymt block för att anropa "set_record"-elementet i paketet.
  • Kodrad 38: Anrop har gjorts till 'set_record' för paketet guru99_get_set. Nu är paketet instansierat och det kommer att finnas kvar till slutet av sessionen.
  • Paketinitieringsdelen exekveras eftersom detta är det första anropet till paketet.
  • Posten infogas av elementet 'set_record' i tabellen.
  • Kodrad 41: Anropar 'get_record'-elementet för att visa detaljerna om den infogade medarbetaren.
  • Paketet hänvisas för andra gången under 'get_record'-anropet till paketet. Men initialiseringsdelen exekveras inte den här gången eftersom paketet redan är initierat i denna session.
  • Kodrad 42-45: Skriver ut personaluppgifter.

Beroende i paket

Eftersom paketet är den logiska grupperingen av relaterade saker, har det vissa beroenden. Följande är beroendet som ska tas om hand.

  • En specifikation är ett fristående objekt.
  • En paketkropp är beroende av specifikation.
  • Paketets kropp kan sammanställas separat. Närhelst specifikationen kompileras måste kroppen kompileras om eftersom den blir ogiltig.
  • Underprogrammet i paketkroppen som är beroende av ett privat element bör definieras först efter deklarationen av det privata elementet.
  • Databasobjekten som hänvisas till i specifikationen och texten måste vara i giltig status vid tidpunkten för paketkompileringen.

Paketinformation

När paketinformationen har skapats är paketinformationen såsom paketkälla, underprogramsinformation och överbelastningsinformation tillgänglig i Oracle datadefinitionstabeller.

Tabellen nedan visar datadefinitionstabellen och paketinformationen som är tillgänglig i tabellen.

Tabellnamn BESKRIVNING Fråga
ALLA_OBJEKT Ger information om paketet som object_id, creation_date, last_ddl_time, etc. Det kommer att innehålla de objekt som skapats av alla användare. SELECT * FROM all_objects där objektnamn =' '
USER_OBJECT Ger information om paketet som object_id, creation_date, last_ddl_time, etc. Det kommer att innehålla de objekt som skapats av den aktuella användaren. SELECT * FROM user_objects där objektnamn =' '
ALL_SOURCE Anger källan till objekten som skapats av alla användare. SELECT * FROM all_source där namn=' '
USER_SOURCE Anger källan till objekten som skapats av den aktuella användaren. SELECT * FROM user_source där namn=' '
ALLA_PROCEDURER Ger underprogrammet detaljer som object_id, överbelastningsdetaljer etc skapade av alla användare. VÄLJ * FRÅN alla_procedurer
Där objektnamn=' '
USER_PROCEDURES Ger underprogrammet detaljer som object_id, överbelastningsdetaljer, etc. skapade av den aktuella användaren. SELECT * FROM user_procedures
Där objektnamn=' '

UTL-FIL – En översikt

UTL File är det separata verktygspaketet som tillhandahålls av Oracle att utföra speciella uppgifter. Detta används främst för att läsa och skriva operativsystemfiler från PL/SQL-paket eller underprogram. Den fick separata funktioner för att lägga informationen och att hämta informationen från filer. Det gör det också möjligt att läsa/skriva i den ursprungliga teckenuppsättningen.

Programmeraren kan använda detta för att skriva operativsystemfiler av vilken typ som helst och filen kommer att skrivas direkt till databasservern. Namnet och katalogsökvägen kommer att nämnas när du skriver.

Sammanfattning

Vi har nu lärt oss paketen PL / SQL, och du bör nu kunna arbeta i följande.

  • PL/SQL-paket och dess komponenter
  • Egenskaper för paket
  • Referera och överbelasta paketelement
  • Hantera beroenden i paket
  • Visa paketinformation
  • Vad är UTL-fil