A PL/SQL programozási nyelv

Java és PL/SQL

Javabl PL/SQL

Lehetsgnk van kls programkdbl is futtatni a trolt eljrsokat, illetve fggvnyeket. Az albbiakban tallhat egy rszletes lers a PL/SQL nyelv fggvnyeinek s eljrsainak Java nyelven ksztett programbl trtn futtatshoz. Lpsek:

JDBC (Java Database Connectivity)

Egy api, ami megtallhat a Java SE, illetve a Java EE JDK-ban. Tartalmazza azokat az osztlyokat, melyek az adatbzis lekrdezshez s mdostshoz hasznlandk. A relcis adatmodellhez igazodik.

Adatbzis kapcsolat ltrehozsa Java oldalon

A Connection objektum felels a Java kdban az adatbzis kapcsolat ltrehozsrt. Tartalmazza az adatbzis adatait, melyek a kvetkezk a teljessg ignye nlkl:

Connection conn = DriverManager.getConnection( "jdbc:valamijdbcforgalmazo:tovbbi adatok a jdbc forgalmaztl fggen", "felhasznlnv", "jelsz");

A getConnection paramterei a kvetkezk: URL (mindig jdbc:-al kezddik, a tbbi rsze a driver ksztjtl fgg), felhasznlnv, jelsz

Ksztsk el a trolt eljrsunk, amit meghvunk.
CREATE OR REPLACE FUNCTION hello_func (hname VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN 'Hello ' || hname; END;

Ez a fggvny egy nevet vr paramterl s visszadja a Hello s a paramterben kapott nv konkatencijt. Miutn megrtuk a fggvnyt fordtsuk be az adatbzisba.

jra a Java rsznl vagyunk, most elksztjk a lnyegi rszt. A trolt eljrsok meghvshoz szksges Java implementcit a CallableStatement objektum tartalmazza. Ennek kt fle vltozata van, az egyik tartalmaz egy visszatrsi rtket, mg a msik nem. A kett kzl a megfelel kivlasztsa nem a mi feladatunk, ezt a Java virtulis gp futsi idben dnti el. A kivlaszts sorn figyelembe veszi a virtulis gp, hogy van-e visszatrsi rtke az adott fggvnynek (ebbl csak egy lehet). A bemen paramterek ettl fggetlenl, lehetnek csak bemen, csak kimen vagy bemen s kimen paramterek is.

Ltrehozunk egy CallableStatement-t utastst, majd belltjuk a paramtereket s lefuttatjuk azt. Fontos, hogy ha szeretnnk elrni a meghvott kd visszatrsi rtkt, azt ki kell regisztrlnunk. Ezutn mr elrhet a get+Tpus utastssal. A bemen paramtereket a set+Tpus utastssal llthatjuk be. Az els paramter a sorszma, mg a msodik a belltand rtk.

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 osztlyt mg le kell fordtani, hogy a Java virtulis gp szmra is rtelmezhet programkd legyen. Ezt a konzolbl a

javac Hello.java
parancskiadasval tehetjk meg. A fordts sikeres lefutsa esetn lthatjuk, hogy a Hello.java mellett ltrejtt egy Hello.class fjl is.

A Hello.class forrskdot szintn konzolbl tudjuk futtatni, ami a

java Hello World!
utasts kiadsval trtnik. Itt a "World!" egy paramter, ezt fzi hozz a pl/sql trolt eljrsunk a Hello szveghez.

Ha mindent helyesen csinltunk, akkor a konzolban a program lefutsa utn a Hello World!

Nem csak a PL/SQL kd hvhat, fordtottan is hasznlhatjuk, azaz PL/SQL-bl is lehet Java kdot hvni.

Lpsek:

Java osztlyunk egy egyszer metdusbl ll, ami visszaadja a Hello world from "paramterben kapott szveg" ! zenetet

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

A fordtsa console-bl trtnik a

javac -target 1.5 HelloWorld.java
parancs kiadsval. Amennyiben a kvetkez hibazenetet kapjuk: 'javac' is not recognized as an internal or external command, operable program or batch file. Ilyenkor be kell lltani a krnyezeti vltozkat, amit a kvetkez paranccsal tehetnk meg: set path="%path%;${path/to/java/bin}" Pl.: C:\Program Files\Java\jdk1.7.0_55\bin

A lefordtott java kd betltse az adatbzisba:

loadjava -v -user felhasznlnv/jelsz@localhost:1521:orcl -resolve HelloWorld.class
A kd lefuttatsa utn lthatjuk, hogy ltrejtt egy j tbla az adatbzisunkban "". Itt blob fjlknt troldik a Java programkd, amit meghvskor az Oracle szerveren tallhat Java virtulis gp futtat le.

Ha mgsem szeretnnk a java osztlyunkat az adatbzisban trolni, akkor az albbi parancsal trlhet:

dropjava -v -user felhasznlnv/jelsz@localhost:1521:orcl -resolve HelloWorld.class

Kvetkez lpsknt elksztnk egy pl/sql fggvnyt, amely a java kd meghvsrl kondoskodik.

-- Java osztly fggvnynek meghvshoz hasznlt wrapper fggvny CREATE OR REPLACE FUNCTION -- fggvny definci say_hello ( p_name varchar2 ) return varchar2 AS language java name -- Java oszty fggvnynek meghvsa 'HelloWorld.sayHello ( java.lang.String ) return java.lang.String';

A kdokat mr el is ksztettk. Mr csak kt dolog maradt htra, az els, hogy bekapcsoljuk az adatbzisunk konzoljt. Ezt a

dbms_output on;
parancs futtatsval tehetjk meg.

Vgl meghvjuk a PL/SQL fggvnynket.

-- pl sql fggvny meghvsa, ami a java metdust hvja meg BEGIN dbms_output.put_line( say_hello( 'Oracle' ) ); END;

Ha mindent jl csinltunk, akkor a "Hello world from Oracle!" szveg megjelenik az adatbzis szerkeszt program console-jban.

Lehetsgnk van kombinlni is a kt nyelv kztti hvsokat, azaz tudunk Java-bl olyan PL/SQL eljrst hvni, ami maga is egy Java kdot hv meg. (Br ennek nincs sok rtelme, mert a teljestmny szempontjbl nem tl idelis.)