A PL/SQL programozási nyelv

Java és PL/SQL

Javaból PL/SQL

Lehetõségünk van külsõ programkódból is futtatni a tárolt eljárásokat, illetve függvényeket. Az alábbiakban található egy részletes leírás a PL/SQL nyelv függvényeinek és eljárásainak Java nyelven készített programból történõ futtatásához. Lépések:

JDBC (Java Database Connectivity)

Egy api, ami megtalálható a Java SE, illetve a Java EE JDK-ban. Tartalmazza azokat az osztályokat, melyek az adatbázis lekérdezéséhez és módosításához használandók. A relációs adatmodellhez igazodik.

Adatbázis kapcsolat létrehozása Java oldalon

A Connection objektum felelõs a Java kódban az adatbázis kapcsolat létrehozásáért. Tartalmazza az adatbázis adatait, melyek a következõk a teljesség igénye nélkül:

Connection conn = DriverManager.getConnection( "jdbc:valamijdbcforgalmazo:további adatok a jdbc forgalmazótól függõen", "felhasználónév", "jelszó");

A getConnection paraméterei a következõk: URL (mindig jdbc:-al kezdõdik, a többi része a driver készítõjétõl függ), felhasználónév, jelszó

Készítsük el a tárolt eljárásunk, amit meghívunk.
CREATE OR REPLACE FUNCTION hello_func (hname VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN 'Hello ' || hname; END;

Ez a függvény egy nevet vár paraméterül és visszadja a Hello és a paraméterben kapott név konkatenációját. Miután megírtuk a függvényt fordítsuk be az adatbázisba.

Újra a Java résznél vagyunk, most elkészítjük a lényegi részt. A tárolt eljárások meghívásához szükséges Java implementációt a CallableStatement objektum tartalmazza. Ennek két féle változata van, az egyik tartalmaz egy visszatérési értéket, míg a másik nem. A kettõ közül a megfelelõ kiválasztása nem a mi feladatunk, ezt a Java virtuális gép futási idõben dönti el. A kiválasztás során figyelembe veszi a virtuális gép, hogy van-e visszatérési értéke az adott függvénynek (ebbõl csak egy lehet). A bemenõ paraméterek ettõl függetlenül, lehetnek csak bemenõ, csak kimenõ vagy bemenõ és kimenõ paraméterek is.

Létrehozunk egy CallableStatement-t utasítást, majd beállítjuk a paramétereket és lefuttatjuk azt. Fontos, hogy ha szeretnénk elérni a meghívott kód visszatérési értékét, azt ki kell regisztrálnunk. Ezután már elérhetõ a get+Típus utasítással. A bemenõ paramétereket a set+Típus utasítással állíthatjuk be. Az elsõ paraméter a sorszáma, míg a második a beállítandó érték.

CallableStatement cstmt = conn.prepareCall("{? = CALL hello_func(?)}"); cstmt.registerOutParameter(1, Types.String); cstmt.setString(2, helloMessage); cstmt.executeUpdate(); String helloMessage = cstmt.getString(1);

A Hello.java osztályt még le kell fordítani, hogy a Java virtuális gép számára is értelmezhetõ programkód legyen. Ezt a konzolból a

javac Hello.java
parancskiadaásával tehetjük meg. A fordítás sikeres lefutása esetén láthatjuk, hogy a Hello.java mellett létrejött egy Hello.class fájl is.

A Hello.class forráskódot szintén konzolból tudjuk futtatni, ami a

java Hello World!
utasítás kiadásával történik. Itt a "World!" egy paraméter, ezt fûzi hozzá a pl/sql tárolt eljárásunk a Hello szöveghez.

Ha mindent helyesen csináltunk, akkor a konzolban a program lefutása után a Hello World!

Nem csak a PL/SQL kód hívható, fordítottan is használhatjuk, azaz PL/SQL-bõl is lehet Java kódot hívni.

Lépések:

Java osztályunk egy egyszerû metódusból áll, ami visszaadja a Hello world from "paraméterben kapott szöveg" ! üzenetet

public class HelloWorld { public static String sayHello( String pName ){ return "Hello World from " + pName; } }

A fordítása console-ból történik a

javac -target 1.5 HelloWorld.java
parancs kiadásával. Amennyiben a következõ hibaüzenetet kapjuk: 'javac' is not recognized as an internal or external command, operable program or batch file. Ilyenkor be kell állítani a környezeti változókat, amit a következõ paranccsal tehetünk meg: set path="%path%;${path/to/java/bin}" Pl.: C:\Program Files\Java\jdk1.7.0_55\bin

A lefordított java kód betöltése az adatbázisba:

loadjava -v -user felhasználónév/jelszó@localhost:1521:orcl -resolve HelloWorld.class
A kód lefuttatása után láthatjuk, hogy létrejött egy új tábla az adatbázisunkban "". Itt blob fájlként tárolódik a Java programkód, amit meghíváskor az Oracle szerveren található Java virtuális gép futtat le.

Ha mégsem szeretnénk a java osztályunkat az adatbázisban tárolni, akkor az alábbi parancsal törölhetõ:

dropjava -v -user felhasználónév/jelszó@localhost:1521:orcl -resolve HelloWorld.class

Következõ lépésként elkészítünk egy pl/sql függvényt, amely a java kód meghívásáról kondoskodik.

-- Java osztály függvényének meghívásához használt wrapper függvény CREATE OR REPLACE FUNCTION -- függvény definíció say_hello ( p_name varchar2 ) return varchar2 AS language java name -- Java osztáy függvényének meghívása 'HelloWorld.sayHello ( java.lang.String ) return java.lang.String';

A kódokat már el is készítettük. Már csak két dolog maradt hátra, az elsõ, hogy bekapcsoljuk az adatbázisunk konzolját. Ezt a

dbms_output on;
parancs futtatásával tehetjük meg.

Végül meghívjuk a PL/SQL függvényünket.

-- pl sql függvény meghívása, ami a java metódust hívja meg BEGIN dbms_output.put_line( say_hello( 'Oracle' ) ); END;

Ha mindent jól csináltunk, akkor a "Hello world from Oracle!" szöveg megjelenik az adatbázis szerkesztõ program console-jában.

Lehetõségünk van kombinálni is a két nyelv közötti hívásokat, azaz tudunk Java-ból olyan PL/SQL eljárást hívni, ami maga is egy Java kódot hív meg. (Bár ennek nincs sok értelme, mert a teljesítmény szempontjából nem túl ideális.)