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

Csomag létrehozása PL/SQL-ben

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.

Nyilatkozatok továbbítása

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

A túlterhelés

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.

A túlterhelés

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.

A túlterhelés

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