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