A két világ legjobbja a java hívás pl
Az Oracle8i megjelenésével a fejlesztők a PL / SQL mellett kihasználhatják az Internet szabványos Java programozási nyelvét. Ez a cikk megmondja, hol kezdjem.
Az Oracle8i-ban, az adatbázis-kiszolgálón tárolt és futtatott alkalmazások létrehozásához a fejlesztők két programozási nyelv közül választhatnak: PL / SQL és széleskörű Java. PL / SQL és Java alkalmazások közvetlenül kölcsönhatásba az adatbázisban, Java-alkalmazás logikáját bővítheti a meglévő PL / SQL-programok, valamint a Java-tárolt programok hívhatják PL / SQL szerver szoftver (lásd. 1. ábra).
A napirend első tétele a Java Development Kit (JDK) 1.1.5 vagy újabb verziójának telepítése. A JDK az Oracle8i-vel szállít. letölthető a Sun Microsystems Java weboldaláról is. Győződjön meg róla, hogy a CLASSPATH környezeti változó úgy van beállítva, hogy a Java fordító megtalálja a létrehozott osztályt, valamint az Oracle által biztosított osztályokat.
A kezdeti információk az ebben a kiadásban megjelent "Az PL / SQL és Java" megjegyzésben találhatók.
Hozzáférés a Java-hoz a PL / SQL-ből
A tárolt Java-eljárások elérése az Oracle adatbázisból hat alapvető lépésből áll.
1. lépés: Határozza meg, mely Java-funkciót kívánja használni az alkalmazásban. Ellenőrizze, hogy a meglévő Java osztálykönyvtárak tartalmaznak-e előre definiált Java-osztályokat, amelyek tartalmaznak ilyen funkciójú módszereket.
2. lépés: Hozzon létre egy speciális Java-osztályt, amely e funkciókra épülő módszereket tartalmaz.
3. lépés: Töltsd le ezt a Java osztályt, próbáld ki és töltsd be az adatbázishoz.
4. lépés: Hozzon létre egy PL / SQL csomagoló programot, amely a tárolt Java műveletet fogja hívni.
5. lépés: Adja meg a PL / SQL csomagolóprogramhoz és a tárolt Java-eljárásokhoz szükséges jogosultságokat.
6. lépés: Hívja a PL / SQL programot.
Annak érdekében, hogy bemutassam ezeket a lépéseket, és biztosítsam azt a technológiát, amelyre szükséged van a munkához, nagyon egyszerű példát fogok használni. Ez a következő: szeretném törölni az operációs rendszer fájlokat a PL / SQL programból. Az Oracle8 8.1-es és Java-támogatása előtt csak a következő lehetőségek álltak rendelkezésre:
- Az Oracle7 7.3-as verziójában üzenetet küldhet az adatbázis csatorna számára, majd a C-hallgató program lehallgatta az üzenetet ("Fájl törlése X"), és elvégezte az összes munkát.
- Az Oracle8 Release 8.0-ban létrehozhat egy olyan könyvtárat, amely egy dinamikusan összekapcsolt C-könyvtárra (DLL) vagy egy megosztott könyvtárra mutat. Ezután a PL / SQL-ből a könyvtár programját hívhatja a fájl törléséhez.
A csatorna technológia kényelmes, de mesterséges eszköz. Vneshneprotsedurny megközelítés, bár ez a legjobb megoldás, de ez nem olyan közvetlen módon, különösen akkor, ha nem ismeri a nyelvet C. Másrészt, Java tartalmaz előre definiált osztályok, melyek erős, könnyen kezelhető alkalmazás programozási felületek (API-k) széles számos funkciót, beleértve az I / O fájlokat is.
1. lépés. Keresse meg a kívánt előre definiált Java-funkciókat.
public class java.io.Fájl nyilvános logikai törlése ();
nyilvános logikai mkdir ();
>
Más szóval, boolean Java módszert hívhatok a kért fájl törléséhez. Ha a módszer törli a fájlt, akkor a TRUE értéket adja vissza, ellenkező esetben FALSE értéket ad vissza.
Java tárolt eljárások
2. lépés: Egyéni Java osztály létrehozása
Lehet, hogy vajon miért van szükség egy másik Java osztály létrehozására a File osztály alapján. Miért nem hívhatja közvetlenül a File.delete-t közvetlenül a csomagolóprogramból? Ennek két oka van:
- A Java-módszer szinte minden esetben (kivéve a statikus módszereket és osztálymódszereket) az osztályból létrehozott speciális objektumból hajt végre. Nem nyerhet ki egy Java objektumot a PL / SQL-ből, majd felhívhat egy módszert erre az objektumra.
- A Java és a PL / SQL adattípusok nem egyeznek közvetlenül egymással. Például egy logikai Java adat típusát nem adhatja át egy Boolean PL / SQL típusú adattípusnak.
Ezért új osztályt kell létrehoznia, amely:
- Hozzon létre egy objektumot a File osztályból
- Hívja az objektum törlés módját
- Visszaad egy olyan értéket, amelyet a PL / SQL értelmezhet
A következő egy egyszerű osztály, amelyet létrehoztam a File.delete módszer kihasználásához:
import java.io.File;
nyilvános osztály JDelete public static int delete (String fájlnév) Fájl myFile = új fájl (fileName);
logikai retval = myFile.delete ();
ha (retval) visszatér 1; egyébként visszatér 0;
> // módszer törlése
> // Jdelete osztály
A JDelete.delete módszer egyszerűen létrehoz egy üres fájlobjektumot az adott fájlnévhez, így felhívhatom a fájl törlési módját. A statikus módszer deklarálásával elérhetővé teszem, elkerülve az objektum létrehozásának szükségességét: a statikus módszerek az osztályokhoz kapcsolódnak, nem pedig ezeknek az osztályoknak az objektumaihoz.
Ez az osztály kiemeli a Java és a PL / SQL közötti különbségeket:
- A Java nem rendelkezik BEGIN és END utasításokkal blokkok, hurok és állapot utasítások esetén. Ehelyett a záró zárójelet () kell használni.
- A Java a kis- és nagybetűkre érzékeny, ami azt jelenti, hogy ha nem ugyanaz, mint az IF vagy az If vagy az iF.
- A Java-hozzárendelési operátor egyszerűen az "egyenlő" (=) jel, ellentétben a PL: SQL komplex karakterrel (: =).
- Ha olyan eljárást hív meg, amely nem rendelkezik argumentummal (például a példában a törlés módja), akkor még meg kell adnia a záró és záró zárójeleket; ellenkező esetben a Java-fordító megkísérli értelmezni a módszert az osztály vagy az adatszerkezet tagjaként.
3. LÉPÉS: Az osztály lefordítása, tesztelése és betöltése egy Oracle adatbázisba
A fordításhoz az osztály által írt nekem, azt kell menni a könyvtárba, ahol az osztály található, és a parancssorból javac parancs segítségével az osztály nevét, mint egy érv:
D: \ Java> javac JDelete.java
Most van értelme tesztelni a módszert, mielőtt betölti az adatbázist. Mindig jobb létrehozni és azonnal ellenőrizni. A Java egyszerű módja ennek: a fő módszer. Ha az osztályban megad egy érvénytelenített nevű eljárást, amelyik a legfontosabbakat nevezi meg, és megadja azt egy érvényes argumentumlistát, akkor hívhatja az osztályt és kódját végrehajtja. Adja hozzá a fő módszert a JDelete-hez, az alábbiak szerint:
nyilvános osztály JDelete public static int delete
nyilvános statikus érvénytelen fő (String args []) System.out.println (delete (args [0]));
> // fő módszer
> // class JDelete
Más szavakkal, a módszer törli a törlést az első értéknek az osztályhoz, majd megjeleníti a visszatérési értéket. Most újra kell fordítani az osztályt és futtatni (ez a példa a DOS ablakból indul):
D: \ Java> javac JDelete.java
D: \ Java> java JDelete: c: \ temp \ te_employ.pks
1
D: \ Java> java JDelete: c: \ temp \ te_employ.pks
0
Vegye figyelembe, hogy először JDelete hívott, 1 (TRUE) jelenik meg, mert az én módom törölte a fájlt. Amikor ezt a parancsot újraindították, megjelenik 0, mert a módszer nem tudta törölni a még létező fájlt.
Most, hogy biztos vagyok benne, hogy a törlés módja működik, a loadjava parancsot betöltem. A loadjava egy Oracle segédprogram, amely az operációs rendszer parancssorából fut, amely Java kód elemeket (osztályokat, jar fájlokat és hasonlókat) tölt be egy Oracle adatbázisba. Betöltöttem az osztályt az Oracle adatbázis SCOTT sémájába:
D: \ Java> loadjava -user scott / tiger -oci8 -oldat JDelete.class
Annak ellenőrzésére, hogy az osztály valóban betöltött-e, kérlek a USER_OBJECTS adatszótár-nézet tartalmát (lásd 1. lista).
Ezzel lezárja a Java-specifikus lépésekkel kapcsolatos problémákat. Ideje visszatérni a PL / SQL ismerős világába.
4. LÉPÉS PL / SQL hívás specifikáció készítése
Szeretnék mindenkinek megadni a lehetőséget, hogy csatlakozzon az adatbázis-példányhoz a PL / SQL fájlok törléséhez. Ennek elérése érdekében, létrehozok egy hívás leírás (más néven hívás spec), úgy néz ki, mint egy PL / SQL-függvény, de valójában ez csak egy shell, hogy hívja a fő Java-kód:
CREATE OR REPLACE FUNCTION fDelete
(IN VARCHAR2 fájl)
VISSZATÉRÍTÉSI SZÁM
AS NYELV JAVA
NAME 'JDelete.delete (java.lang.String)
return int ';
/
Az fDelete függvény végrehajtása a Java metódusát leíró vonalakból áll. A paraméterlistanak meg kell felelnie a módszer paramétereinek, de minden paraméter helyett meg kell adnia az adattípus pontos pontos nevét. (Java nem használ a globális változók, és minden területen, és a módszer kötve az osztály, és minden osztály része a csomagnak Ez a hierarchia mechanizmust biztosít a teljes elérési útvonalat, és megakadályozza, ellentmondások a névtérben.). Ebben az esetben azt jelenti, hogy nem tudok csak tárcsázni String-et, hanem hozzá kell adnia a String-osztályt tartalmazó csomag teljes nevét. A RETURN záradék egyszerűen az egész számokra utal. int egyike az elemi Java adattípusoknak, nem egy osztálynak, tehát teljes specifikációjának.
5. LÉPÉS: Oracle adatbázis-jogosultságok létrehozása
Az Oracle8i két új szerepkört kínál a Java biztonságának támogatásához. Sok a műveletek összpontosított Java, nem kell ezeket a szerepeket, de ha azt szeretnénk, hogy befolyásolja az operációs rendszer, például hozzáférni az operációs rendszer fájlokat vagy módosítják őket, akkor kell lennie egy Javasyspriv vagy Javauservpriv. Ennek a szerepnek a biztosítása nem különbözik más adatbázis szerepének biztosításától. Például ahhoz, hogy a SCOTT elvégezhessen bármilyen Java-műveletet, a SYSDBA-fiókból a következő parancsot kell futtatnia:
GRANT JAVASYSPRIV A SCOTT-T;
Ha bizonyos korlátozásokat kíván alkalmazni arra vonatkozóan, hogy mit tehet a felhasználó a Java-val, akkor ezt a parancsot kell futtatnia:
GRANT JAVAUSERPRIV a SCOTT-hoz;
Fájl létrehozásához vagy törléséhez a Java használatával meg kell adni a JAVASYSPRIV szerepkört; egy fájl olvasása vagy írása elég ahhoz, hogy a JAVAUSERPRIV szerepe legyen.
Inicializálásnál JServer Java-gép, telepített példányát a Java-osztály Java Security Manager (Java Security Manager) java.lang .SecurityManager. Minden adatbázis-felhasználó dinamikus azonosítója (ID). amely megfelel a munkamenet tulajdonosának, amikor a felhasználó a Java-módszereket a PL / SQL-ből érinti. Ha a felhasználó nem rendelkezik megfelelő jogosultsággal, próbálja meg végrehajtani a műveletet, a virtuális Java-gép gerjeszti java.lang.SecurityException kizárás (hasonlít a koncepció kivételek mező PL / SQL). Az SQL * Plus-ban a következők láthatók:
ORA-29532: A Java-hívás befejeződött a megakadályozatlan Java-kivétellel: java.lang.SecurityException
Amikor futtatja a Java-alapú módszerek az adatbázison belül, akkor különféle problémák léphetnek kapcsolatos biztonsági, különösen akkor, ha a program együttműködik a fájlrendszer a szerver oldalon, vagy a másik operációs rendszer erőforrásait. Az Oracle adatbázis-kiszolgáló az adatbiztonság ellenőrzésének két szabályát követi az I / O műveletek végrehajtása előtt:
- Ha a dinamikus azonosítást megkapta a JAVASYSPRIV jogosultság, akkor a Security Manager lehetővé teszi a művelet végrehajtását;
- Ha a dinamikus azonosító jogosultság elnyerésének JAVAUSERPRIV a biztonsági menedzser ugyanazok a szabályok által használt PL / SQL-csomag UTL_FILE annak megállapítására, hogy a művelet engedélyezett, amelyek kimondják, hogy a fájlnak kell lennie a megadott könyvtárban UTL_FILE_DIR paraméter az adatbázisban inicializáló fájl .
6. LÉPÉS A PL / SQL program hívása
Most már a Java komponensek vannak a helyükön, a szükséges jogosultságokat biztosítják, összeállítom a PL / SQL függvényt, majd végrehajtom a varázslatos, korábban nehéz trükköt:
SQL> @ fdelete.sf
Funkció létrehozva.
A bevitel 12 karakterrel csonka
SQL> exec DBMS_OUTPUT.PUT_LINE (
fdelete ('c: \ temp \ te_employee.pkb'))
1
SQL> exec DBMS_OUTPUT.PUT_LINE (
fdelete ('c: \ temp \ te_employee.pkb'))
0
Ezen funkció alapján is létrehozhat segédprogramokat. Például létrehozhat egy eljárást, amely törli az összes fájlt egy beágyazott táblázat soraiban. Vagy még jobb, akkor írj egy eljárást, amely vesz bemenetként egy könyvtár nevét és egy szűrő (például „minden fájl, mint a * .tmp”) és törli az összes fájlt egy könyvtárba, hogy adja át a szűrőn.
Egy pillantás a jövőre
Ha korábban soha nem használtad a Java-t, remélem, most elmondod magadnak: "Hé, könnyebb, mint gondoltam!" A Java számos további funkciót tartalmaz, mint amennyit említettem ebben a cikkben, de a JDelete példának bizalmat kell adnia a Java használatának. A Java beágyazása PL / SQL alkalmazásokba természetesen sokkal összetettebb lehet, attól függően, hogy mit fogsz csinálni. Néhány problémát megvitatok a sorozat következő cikkében.
Elsődleges Java szójegyzék
Osztály (class) Building Block Java-alapú alkalmazások, az osztály egy csoportja adatokat (tag), amely összefüggésbe hozható a program (módszerek), hogy végre műveleteket az adatokat. PL / SQL csomagot valami hasonló egy osztály, kivéve, hogy nem lehet létrehozni egy külön objektum a zsákból, így ez több, mint a Java-statikus osztály.
Adattípusok (adattípusok) Minden a Java-ban egy osztályon keresztül definiálható, kivéve az elemi adattípusokat. Tehát a String egy osztály, ezért amikor egy String típusú változót deklarálsz, akkor egy objektumot hozol létre ezen az osztályon. Az alapvető Java adattípusok négyféle egész számot tartalmaznak, valamint logikai, char, double és float.
Az instantiáció Ha egy általánosabb struktúrából egy privát példányt szeretne létrehozni, deklarálnia kell az objektumot mint példány vagy osztály végrehajtását. A PL / SQL-ben kijelölhet egy típusú rekordot (TYPE), majd deklarálhatja a rekord ilyen típusú példányát.
Tag A osztály tartalmazhat számos változót, módszert, és egyéb osztályokat (például Java 1.1-es osztályokat), amelyek mindegyike csoportosan tagjai. A tagjai között egy osztály határozható meg, amely információkat tartalmaz az egész osztályról (statikus tagok) vagy az ezen osztályba tartozó objektumok megvalósításáról. Az osztály tagjai hasonlóak a csomag szintű változókhoz a PL / SQL-ben. Azonban minden alkalommal, amikor létrehoz egy objektumot egy osztályból, új tagokat kap. A csomagnak csak egy adatbevitele van az Oracle adatbázis munkamenet során.
Módszer Egy módszer egy olyan Java programozási nyelvű operátorok egy megnevezett csoportja, amelyek egy adott osztályhoz vannak társítva, és amelyek osztályba sorolható objektumokhoz szólíthatók. A Java-ban definiálhatunk olyan statikus módszereket (más néven osztálymódokat), amelyek közvetlenül az osztályból érhetők el objektum létrehozása nélkül. A fő módszert mindig statikusnak is nyilvánították.
Az objektum egy példánynak is nevezhető, az objektum egy végrehajtható kód eleme, amely kifejezetten végrehajtja az osztály alapvető struktúráját. Az osztály egy általános típusú sablon (sor), amely a struktúrát és szabályokat biztosítja ennek a struktúrának. Általában egy objektum egy olyan adatelem, amelyet az alkalmazásában manipulál.
Csomag A csomag egy Java nyelvi elem, amelyet a közös nevekhez tartozó osztályok csoportosításához használnak. A Java API összes csomagja egy csomagba van csoportosítva, a java néven. A java csomagon belül más csomagok vannak csoportosítva funkcionalitással, például a java.util csomag tartalmazza a segédprogramok fő osztályait.
A Java programozásra szánt könyvek százai vannak. Íme néhány kedvencem:
Annak ellenőrzésére, hogy az osztály és annak módszerei léteznek-e az adatbázisban
kérje az adatszótár-nézet tartalmát USER_OBJECTS,
a következő lekérdezés használatával:
# 9; SELECT object_name, object_type, status, timestamp
# 9; WHERE (objektumnév nem tetszik "SYS_%"
# 9; # 9; # 9; ÉS az objektumnév nem tetszik "CREATE $%"
# 9; # 9; # 9; ÉS az objektumnév nem tetszik "JAVA $%"
# 9; # 9; # 9; ÉS az objektumnév nem tetszik "LOADLOB%")
# 9; ÉS object_type LIKE "JAVA%"
# 9; ORDER BY object_type, object_name;
Itt a lekérdezés eredménye:
# 9; Objektum neve # 9; 9. objektumtípus; 9. állapot; # 9. Időbélyegző