Oracle PL / SQL-paket: typ, specifikation, kropp (exempel)

Innehållsförteckning:

Anonim

Vad är paketet i Oracle?

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

I den här handledningen lär du dig-

  • Komponenter i paket
  • Paketspecifikation
  • Förpackningens kropp
  • Hänvisande paketelement
  • Skapa paket i PL / SQL
  • Framåtförklaringar
  • Marköranvändning i paketet
  • Överbelastning
  • Beroende på paket
  • Paketinformation
  • UTL FILE - En översikt

Komponenter i paket

PL / SQL-paketet har två komponenter.

  • Paketspecifikation
  • Förpackningens kropp

Paketspecifikation

Paketspecifikationen består av en deklaration av alla offentliga variabler, markörer, objekt, procedurer, funktioner och undantag.

Nedan följer 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 kropp.
  • När 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 
IS… END 

Ovanstående syntax visar skapandet av paketspecifikation.

Förpackningens kropp

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

Nedan följer egenskaper hos en förpackning.

  • Den bör innehålla definitioner för alla underprogram / markörer som har deklarerats i specifikationen.
  • Det 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å paketets specifikation.
  • Förpackningskroppens tillstånd blir "Ogiltigt" när specifikationen sammanställs. Därför måste den kompileras om varje gång efter att specifikationen har sammanställts.
  • De privata elementen bör definieras först innan de används i paketet.
  • Den första delen av paketet är den globala deklarationsdelen. Detta inkluderar variabler, markörer och privata element (vidarebefordran) som är synliga för hela paketet.
  • Den sista delen av paketet är paketets initialiseringsdel som körs en gång när ett paket hänvisas första gången i sessionen.

Syntax:

CREATE [OR REPLACE] PACKAGE BODY 
IS.END 
  • Ovanstående syntax visar skapandet av paketet.

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

Hänvisande paketelement

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

Alla de offentliga elementen i paketet kan hänvisas genom att anropa paketnamnet följt av elementnamnet åtskilda av perioden, dvs ' . '.

Den offentliga variabeln i paketet 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 skapas en ny instans för det paketet.

Oracle tillhandahåller en möjlighet att initiera paketelement eller att utföra någon aktivitet vid tidpunkten för denna instans skapande genom "Package Initialization".

Detta är inget annat än ett exekveringsblock som skrivs i paketet efter att alla paketelement har definierats. Detta block kommer att köras närhelst ett paket hänvisas för första gången i sessionen.

Syntax

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGINEEND 
  • Ovanstående syntax visar definitionen av paketinitialisering i paketets kropp.

Framåtförklaringar

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

Privata element kan bara hänvisas om de redan deklareras i paketet. Av denna anledning används vidarebefordran. Men det är ganska ovanligt att använda eftersom det oftast privata element deklareras och definieras i den första delen av paketet.

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

Syntax:

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGIN
;END 

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

Marköranvändning i paketet

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

Om markören är definierad i paketspecifikationen eller i en global del av paketkroppen, fortsätter markören när den har öppnats till slutet av sessionen.

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

Överbelastning

Överbelastning är begreppet 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 omslag betraktas som överbelastning.

Detta är användbart när många underprogram behöver göra samma uppgift, men sättet att ringa vart och ett av dem bör vara annorlunda. I det här fallet kommer underprogrammets namn att vara detsamma för alla och parametrarna kommer att ändras enligt samtalsmeddelandet.

Exempel 1 : I det här exemplet ska vi 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 utgång för det angivna anställdsnumret, och set_record-proceduren infogar posttypsposten i emp-tabellen.

Steg 1) Skapa paketspecifikation

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

Kodförklaring

  • Kodrad 1-5 : Skapa 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 paketet, där alla procedurer och funktioner faktiska definition kommer att definieras. I det här steget skapas paketet.

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

Kodförklaring

  • Kodrad 7 : Skapa paketet.
  • Kodrad 9-16 : Definiera elementet 'set_record' som deklareras i specifikationen. Detta är samma som att definiera den fristående proceduren i PL / SQL.
  • Kodrad 17-24: Definiera elementet 'get_record'. Det är samma 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.

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

Kodförklaring:

  • Kodrad 34-37: Att fylla i data för posttypsvariabel i ett anonymt block för att anropa "set_record" -elementet i paketet.
  • Kodrad 38: Samtal har gjorts till 'set_record' för guru99_get_set-paketet. Nu installeras paketet och det kommer att bestå till slutet av sessionen.
  • Paketinitieringsdelen körs eftersom detta är det första samtalet till paketet.
  • Posten infogas av "set_record" -elementet i tabellen.
  • Kodrad 41: Anropar "get_record" -elementet för att visa information om den infogade medarbetaren.
  • Paketet hänvisas för andra gången under "get_record" -samtalet till paketet. Men initialiseringsdelen körs inte den här gången eftersom paketet redan har initierats i den här sessionen.
  • Kodraden 42-45: Skriva ut information om anställda.

Beroende på paket

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

  • En specifikation är ett fristående objekt.
  • En paketdel är beroende av specifikationen.
  • Förpackningens kropp kan sammanställas separat. När specifikationen sammanställs måste kroppen kompileras om eftersom den blir ogiltig.
  • Underprogrammet i paketet som är beroende av ett privat element bör definieras först efter deklarationen om det privata elementet.
  • Databasobjekten som hänvisas till i specifikationen och kroppen måste ha giltig status vid tidpunkten för paketkompilering.

Paketinformation

När paketinformation har skapats finns paketinformation som paketkälla, underprograminformation och överbelastningsinformation tillgänglig i Oracle-datadefinitionstabellerna.

Nedanstående tabell ger datadefinitionstabellen och den paketinformation som finns i tabellen.

Tabellnamn Beskrivning Fråga
ALL_OBJECT Ger detaljerna i paketet som object_id, creation_date, last_ddl_time, etc. Det kommer att innehålla objekten som skapats av alla användare. VÄLJ * FRÅN all_objects där object_name = ' '
USER_OBJECT Ger detaljerna i paketet som object_id, creation_date, last_ddl_time, etc. Det innehåller objekt som skapats av den aktuella användaren. VÄLJ * FRÅN användarobjekt där objektnamn = ' '
ALL_SOURCE Ger källan till de objekt som skapats av alla användare. VÄLJ * FRÅN all_source där name = ' '
USER_SOURCE Ger källan till de objekt som skapats av den aktuella användaren. VÄLJ * FRÅN användarkälla där namn = ' '
ALL_PROCEDURER Ger underprogramdetaljer som objekt_id, överbelastningsinformation etc. skapade av alla användare. VÄLJ * FRÅN all_procedures Where object_name = ' '
USER_PROCEDURES Ger underprogramdetaljer som objekt_id, överbelastningsinformation etc. skapade av den aktuella användaren. VÄLJ * FRÅN user_procedures Where object_name = ' '

UTL FILE - En översikt

UTL File är det separata verktygspaketet som tillhandahålls av Oracle för att utföra speciella uppgifter. Detta används huvudsakligen för att läsa och skriva operativsystemfiler från PL / SQL-paket eller underprogram. Det fick de separata funktionerna för att placera informationen och få 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 katalogvägen kommer att nämnas vid skrivandet.

Sammanfattning

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

  • PL / SQL-paket och dess komponenter
  • Kännetecken för paket
  • Hänvisa och överbelasta paketelement
  • Hantera beroenden i paket
  • Visa paketinformation
  • Vad är UTL-fil