Oracle PL/SQL-csomag: Típus, Specifikáció, Törzs [Példa]
Miben van a csomag Oracle?
A PL/SQL csomag egy kapcsolódó alprogram (eljárás/függvény) logikai csoportosítása egyetlen elembe. A csomag egy adatbázis-objektumként kerül lefordításra és tárolásra, amely később felhasználható.
A csomagok összetevői
A PL/SQL csomag két összetevőből áll.
- Csomag specifikáció
- Csomag test
Csomag specifikáció
A csomag specifikációja a nyilvánosság nyilatkozatából áll változók, kurzorok, objektumok, eljárások, függvények és kivételek.
Az alábbiakban a Csomag specifikáció néhány jellemzője látható.
- A specifikációban deklarált elemek a csomagon kívülről is elérhetők. Az ilyen elemek nyilvános elemként ismertek.
- A csomagspecifikáció egy önálló elem, ami azt jelenti, hogy egyedül is létezhet csomagtörzs nélkül.
- Amikor egy csomag hivatkozott, a csomag egy példánya létrejön az adott munkamenethez.
- Miután a példány létrejött egy munkamenethez, az adott példányban kezdeményezett összes csomagelem a munkamenet végéig érvényes.
Szintaxis
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
A fenti szintaxis a csomagspecifikáció létrehozását mutatja.
Csomag test
Ez a csomagspecifikációban szereplő összes elem meghatározásából áll. Olyan elemek definíciója is lehet, amelyek nincsenek deklarálva a specifikációban, ezeket az elemeket privát elemeknek nevezzük, és csak a csomagon belülről hívhatók meg.
Az alábbiakban egy csomagtest jellemzőit mutatjuk be.
- Tartalmaznia kell az összes alprogram definícióit/kurzorok amelyeket a specifikációban deklaráltak.
- Több alprogramja vagy egyéb eleme is lehet, amelyek nincsenek deklarálva a specifikációban. Ezeket privát elemeknek nevezzük.
- Ez egy megbízható objektum, és a csomag specifikációjától függ.
- A csomag törzsének állapota „Érvénytelen” lesz, amikor a specifikációt összeállítják. Ezért a specifikáció összeállítása után minden alkalommal újra kell fordítani.
- A privát elemeket először meg kell határozni, mielőtt a csomagtörzsben használnák őket.
- A csomag első része a globális deklarációs rész. Ez magában foglalja a változókat, kurzorokat és privát elemeket (további deklaráció), amelyek a teljes csomag számára láthatók.
- A csomag utolsó része a csomag inicializálási része, amely egyszer fut le, amikor egy csomagra először hivatkoznak a munkamenetben.
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>
- A fenti szintaxis a csomagtörzs létrehozását mutatja.
Most meglátjuk, hogyan hivatkozhatunk csomagelemekre a programban.
Hivatkozási csomagelemek
Miután az elemeket deklaráltuk és meghatároztuk a csomagban, hivatkoznunk kell az elemekre a használatukhoz.
A csomag összes nyilvános elemére hivatkozhatunk úgy, hogy meghívjuk a csomag nevét, majd az elem nevét, ponttal elválasztva, pl. . '.
A csomag nyilvános változója ugyanúgy használható értékek hozzárendelésére és lekérésére is, pl. . '.
Csomag létrehozása PL/SQL-ben
A PL/SQL-ben minden alkalommal, amikor egy csomagra hivatkoznak/meghívnak egy munkamenetben, új példány jön létre a csomaghoz.
Oracle lehetőséget biztosít a csomagelemek inicializálására vagy bármely tevékenység végrehajtására a példány létrehozása során a „Csomaginicializálás” segítségével.
Ez nem más, mint egy végrehajtási blokk, amely a csomag összes elemének meghatározása után a csomag törzsébe kerül. Ez a blokk minden alkalommal végrehajtódik, amikor egy csomagra először hivatkoznak a munkamenetben.
Szintaxis
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGINE <Package Initialization> END <package_name>
- A fenti szintaxis a csomag inicializálásának definícióját mutatja a csomagtörzsben.
Nyilatkozatok továbbítása
A továbbítási nyilatkozat/hivatkozás a csomagban nem más, mint a privát elemek külön deklarálása és a csomagtörzs későbbi részében történő meghatározása.
Privát elemekre csak akkor lehet hivatkozni, ha az már deklarálva van a csomagtörzsben. Emiatt előzetes nyilatkozatot használnak. Használata azonban meglehetősen szokatlan, mert a legtöbb esetben a privát elemeket a csomagtörzs első részében deklarálják és definiálják.
A határidős nyilatkozat az általa biztosított lehetőség Oracle, ez nem kötelező, és a használata és a nem használata a programozó igényei szerint történik.
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>
A fenti szintaxis továbbítási deklarációt mutat. A privát elemeket a csomag elülső részében külön deklarálják, és a későbbi részben kerültek meghatározásra.
Kurzorok használata a csomagban
Más elemekkel ellentétben óvatosnak kell lenni a kurzorok használatakor a csomagon belül.
Ha a kurzor a csomagspecifikációban vagy a csomagtörzs globális részében van megadva, akkor a megnyitás után a kurzor a munkamenet végéig megmarad.
Ezért mindig a „%ISOPEN” kurzorattribútumokat kell használni a kurzor állapotának ellenőrzésére, mielőtt hivatkozna rá.
A túlterhelés
A túlterhelés azt jelenti, hogy sok azonos nevű alprogram van. Ezek az alprogramok számos paraméterben vagy paramétertípusban vagy visszatérési típusban különböznek egymástól, azaz az azonos nevű, de eltérő számú paraméterrel, különböző típusú paraméterekkel vagy eltérő újratípussal rendelkező alprogramok túlterhelésnek minősülnek.
Ez akkor hasznos, ha több alprogramnak is ugyanazt a feladatot kell elvégeznie, de mindegyik hívási módnak eltérőnek kell lennie. Ebben az esetben az alprogram neve mindenkinél ugyanaz marad, és a paraméterek a hívó utasítás szerint módosulnak.
Példa 1: Ebben a példában egy csomagot fogunk létrehozni, hogy megkapjuk és beállítsuk az alkalmazottak információinak értékeit az 'emp' táblában. A get_record függvény az adott alkalmazotti számhoz tartozó rekordtípus kimenetet adja vissza, a set_record eljárás pedig beilleszti a rekord típusú rekordot az emp táblába.
Step 1) Csomag specifikáció létrehozása
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
Kód Magyarázat
- Kódsor 1-5: A guru99_get_set csomagspecifikációjának létrehozása egy eljárással és egy funkcióval. Ez a kettő ma már nyilvános eleme ennek a csomagnak.
Step 2) A csomag tartalmazza a Csomag törzsét, ahol minden eljárás és funkció tényleges definíciója lesz meghatározva. Ebben a lépésben létrejön a csomagtörzs.
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
Kód Magyarázat
- 7. kódsor: A csomagtörzs létrehozása.
- Kódsor 9-16: A specifikációban deklarált 'set_record' elem meghatározása. Ez ugyanaz, mint az önálló eljárás meghatározása PL/SQL-ben.
- 17-24. kódsor: A 'get_record' elem meghatározása. Ez ugyanaz, mint az önálló függvény meghatározása.
- 25-26. kódsor: A csomag inicializálási részének meghatározása.
Step 3) Névtelen blokk létrehozása a rekordok beszúrásához és megjelenítéséhez a fent létrehozott csomagra hivatkozva.
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
Kód magyarázata:
- 34-37. kódsor: A rekord típusú változó adatainak feltöltése egy névtelen blokkban a csomag 'set_record' elemének meghívásához.
- 38. kódsor: A guru99_get_set csomag 'set_record' hívása megtörtént. Most a csomag példányosított, és a munkamenet végéig megmarad.
- A csomag inicializálási része végrehajtásra kerül, mivel ez az első hívás a csomaghoz.
- A rekord a 'set_record' elem által beszúrva a táblázatba.
- 41. kódsor: A „get_record” elem meghívása a beillesztett alkalmazott adatainak megjelenítéséhez.
- A csomag a 'get_record' hívás során másodszor hivatkozik a csomagra. Az inicializálási rész azonban ezúttal nem kerül végrehajtásra, mivel a csomag már inicializálva van ebben a munkamenetben.
- 42-45. kódsor: Az alkalmazottak adatainak kinyomtatása.
Függőség a csomagokban
Mivel a csomag a kapcsolódó dolgok logikai csoportosítása, van néhány függősége. Az alábbiakban bemutatjuk a függőséget, amelyről gondoskodni kell.
- A specifikáció egy önálló objektum.
- A csomag teste a specifikációtól függ.
- A csomag törzse külön is összeállítható. Amikor a specifikációt összeállítják, a törzset újra kell fordítani, mivel az érvénytelenné válik.
- A privát elemtől függő alprogramot a csomag törzsében csak a privát elem deklarációja után szabad definiálni.
- A specifikációban és a törzsben hivatkozott adatbázis-objektumoknak érvényes állapotban kell lenniük a csomag összeállításának időpontjában.
Csomaginformáció
A csomaginformációk létrehozása után a csomaginformációk, például a csomag forrása, az alprogram részletei és a túlterhelés részletei elérhetők a következőben Oracle adatdefiníciós táblák.
Az alábbi táblázat az adatdefiníciós táblázatot és a táblázatban elérhető csomaginformációkat tartalmazza.
Tábla neve | Leírás | Kérdés |
---|---|---|
ALL_OBJECT | Megadja a csomag részleteit, például objektum_azonosítója, létrehozási_dátuma, utolsó_ddl_ideje stb. Tartalmazza az összes felhasználó által létrehozott objektumot. | SELECT * FROM all_objects ahol objektum_neve =' ' |
USER_OBJECT | Megadja a csomag részleteit, például objektum_azonosítója, létrehozási_dátuma, utolsó_ddl_ideje stb. Az aktuális felhasználó által létrehozott objektumokat tartalmazza. | SELECT * FROM user_objects ahol objektum_neve =' ' |
ALL_SOURCE | Megadja az összes felhasználó által létrehozott objektumok forrását. | SELECT * FROM all_source ahol név=' ' |
USER_SOURCE | Megadja az aktuális felhasználó által létrehozott objektumok forrását. | SELECT * FROM user_source ahol név=' ' |
ALL_PROCEDURES | Megadja az összes felhasználó által létrehozott alprogram részleteit, például objektum_azonosítóját, túlterhelési részleteit stb. | SELECT * FROM all_procedurs ahol objektum_neve=' ' |
USER_PROCEDURES | Megadja az aktuális felhasználó által létrehozott alprogram részleteit, például objektum_azonosítóját, túlterhelési részleteit stb. | SELECT * FROM user_procedures ahol objektum_neve=' ' |
UTL FÁJL – Áttekintés
Az UTL fájl az általa biztosított külön segédprogramcsomag Oracle speciális feladatok elvégzésére. Ez elsősorban az operációs rendszer fájlok olvasására és írására szolgál PL/SQL csomagokból vagy alprogramokból. Külön funkciókat kapott az információk elhelyezésére és a fájlokból való információ lekérésére. Lehetővé teszi a natív karakterkészletben történő olvasást/írást is.
A programozó ezt felhasználhatja bármilyen típusú operációs rendszer fájl írásához, és a fájl közvetlenül az adatbázis-kiszolgálóra kerül. A név és a könyvtár elérési útja az írás során kerül említésre.
Összegzésként
Most megtanultuk a csomagokat PL / SQL, és most már képesnek kell lennie a következőkben dolgozni.
- PL/SQL csomagok és összetevői
- A csomagok jellemzői
- Csomagelemek hivatkozása és túlterhelése
- Függőségek kezelése csomagokban
- Csomaginformációk megtekintése
- Mi az UTL fájl