Java au coeur de la base de données Oracle
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
32 Tips&techniques
Philippe Daucourt, HEG – Haute école de gestion Arc
Java au cœur de la base de données
Oracle
Depuis la version 8i, Oracle
Les manipulations que nous allons
embarque une machine virtuelle présenter dans cet article s’appliquent
Java (JVM) au cœur de sa base de à une base de données 11gR2 et se ba-
données. Cette caractéristique seront sur le code source Java suivant:
encore mal connue des dévelop-
peurs et peu répandue continue
package ch.hegarc.helloworld;
d’évoluer et la version 11g a
apporté son lot de nouveautés et public class Main {
public static void main(String[] args) {
d’amélioration. Cet article revient System.out.println(“Hello “+ args[0]+ “ !!!“);
}
sur les fondamentaux de cette }
technologie que nous avons eue
l’occasion de mettre en œuvre ré-
Selon la tradition de Ritchie et Ker-
cemment dans le cadre d’un projet nighan, cette classe Java ne fait rien
de recherche appliquée financé d’autre que de récupérer la valeur
par la Commission pour la techno- passée en paramètre au moment de
logie et l’innovation de la Confédé- l’appel, de la concaténer à une chaîne
de caractères puis d’afficher le résultat
ration (CTI).
sur la sortie standard du système.
Malgré sa simplicité, ce bout de
code Java pose un certain nombre de
Chargement de
questions pour être exécuté par la base
de données. Comment charger ce code code Java dans la
source dans la base de données? Com- base de données
ment compiler ce code source en code
Java exécutable? Comment invoquer Pour commencer, nous allons voir
ce traitement? Comment passer un pa- une première méthode qui consiste
ramètre au moment de l’appel? Com- à charger le code source de la classe
ment rediriger la sortie de Java vers dans la base de données et à le com-
celui de la base de données? C’est à piler au moyen de l’instruction SQL sui-
ces quelques questions que nous allons vante:
tenter de répondre dans la suite de cet
article.
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED „ch.hegarc.helloworld.Main“ AS
package ch.hegarc.helloworld;
public class Main {
public static void main(String[] args) {
System.out.println(“Hello “+ args[0]+ “ !!!“);
}
}
Cette instruction a pour effet de
créer un objet de type «Java Source»
ainsi qu’un objet de type «Java Class»
dans le schéma de l’utilisateur qui l’a
exécutée. Le nom indiqué entre «NA-
MED» et «AS» correspond au nom de
la source Java. Le nom de la classe
SOUG Newsletter 1/2012Tips&techniques 33
A N Z E I G E
5% Rabatt auf Oracle- und Oracle-Java-
Seminare für SOUG-Mitglieder Drive your life.
Java correspond quant à elle comme Il s’agit bien ici de donner le nom de Nous allons maintenant nous inté-
à l’accoutumée en Java à la combinai- l’objet de type «Java Source». L’objet resser à une seconde méthode pour
son du nom du paquetage et du nom correspondant à la classe compilée charger du code Java dans la base de
de la classe. Bien que cela ne soit pas sera quant à lui automatiquement sup- données. Cette autre solution consiste
obligatoire, nous recommandons de primé. à ne charger cette fois-ci que la classe
conserver le même nom pour ces deux compilée. Pour cela, nous allons recou-
objets. rir à un utilitaire en ligne de commande
qui s’appelle «loadjava». La classe doit
Une petite exploration des objets du avoir été compilée au préalable soit en
schéma de l’utilisateur nous confirme ligne de commande avec l’utilitaire «ja-
bien la présence de ces deux objets. vac» du Java Development Kit (JDK)
Nous constatons également que les «.» soit en passant par les services d’un
dans les noms de ces objets ont été rem- environnement de développement inté-
placés automatiquement par des «/». gré (IDE) comme NetBeans, Eclipse ou
JDeveloper. Le code compilé doit corre-
spondre à du bytecode Java 1.5.
Voici la structure de la commande
qui nous permet de charger notre clas-
se dans le schéma de l’utilisateur:
loadjava -u user/password@host:port:sid -r -v -f Main.class
Cette première technique de char-
gement permet de stocker le code
source de la classe Java dans la base ■
L’option «-u» permet de spécifier un
de données ce qui nous évite de devoir schéma cible.
le conserver dans un autre référentiel ■
L’option «-r» permet de «résoudre»
externe. la classe avec le «resolver1» par
défaut. Nous n’aborderons pas ce
Néanmoins, cette solution comporte concept dans le cadre de cet artic-
certaines limites puisque le compilateur le.
interne de la base de données ne sem- ■
L’option «-v» permet d’activer le
ble pas toujours compatible à 100% mode «verbose» qui affiche plus
avec la spécification Java. Nous avons d’informations à l’écran.
par exemple constaté que celui-ci ac- ■
L’option «-f» permet de forcer le
cepte certaines annotations («@Inheri- chargement et d’écraser la classe
ted» et «@Retention») mais pas d’autres qui porterait le même nom dans le
(«@Override»). D’autre part, la base de schéma.
données ne supporte actuellement que ■
«Main.class» correspond au nom
du code Java 1.5. du fichier se trouvant dans le ré-
pertoire courant contenant le code
La suppression de ces deux objets compilé.
se fait au moyen de l’instruction SQL
suivante:
DROP JAVA SOURCE “ch/hegarc/helloworld/Main“;
1
http://docs.oracle.com/cd/E11882_01/java.112/e10588/chtwo.htm#BABGJCAJ
SOUG Newsletter 1/201234 Tips&techniques
Une petite exploration des objets du
schéma de l’utilisateur nous confirme
loadjava -u user/password@host:port:sid -r -v -f HelloWorld.jar
bien la présence d’un seul objet de type
«Java Class» cette fois-ci.
Une petite exploration des objets
du schéma de l’utilisateur nous confir-
me bien que le fichier JAR a été chargé
puisqu’un objet de type «Java Class»
y est présent. Nous constatons égale-
ment la présence d’un deuxième objet
de type «Java Resource» correspon-
dant au fichier manifeste2 accompag-
nant généralement un fichier JAR.
Nous pouvons supprimer cette
classe au moyen de l’instruction SQL
suivante:
DROP JAVA CLASS “ch/hegarc/helloworld/Main“;
Il est également possible d’obtenir Bien que cette solution permette
le même résultat en utilisant l’utilitaire de charger facilement de nombreuses
«dropjava» en ligne de commande: classes regroupées au sein du même
fichier JAR, elle présente le gros défaut
de ne pas garder de lien entre celui-ci et
dropjava -u user/password@host:port:sid -v Main.class
les classes extraites. Par conséquent,
il n’est pas possible de supprimer
Dans ce cas, le fichier «Main.class» l’ensemble des classes d’un seul coup
doit obligatoirement se trouver dans le et il faut le faire une à une.
répertoire courant. Si on ne dispose plus
de ce fichier, la seule possibilité pour le La deuxième variante consiste à
supprimer de la base de données con- charger le fichier JAR avec l’option
siste alors à utiliser l’instruction SQL «-jarsasdbobjects». Si cette option est
précédente. présente, la base de données va non
seulement extraire et charger les clas-
Finalement, nous allons voir main- ses du fichier JAR comme auparavant
tenant une troisième méthode qui con- mais elle va également conserver le lien
siste à charger le code Java dans la entre celui-ci et les classes extraites.
base de données au travers d’un fichier
JAR (Java Archive). Nous allons passer loadjava -u user/password@host:port:sid -r -v -f -jarsasdbobjects HelloWorld.jar
en revue les différentes variantes qui
existent. Comme pour la deuxième mé-
thode, la classe doit avoir été compilée Désormais, il suffit de supprimer le
et intégrée à un fichier JAR au préalable fichier JAR pour que toutes ses classes
soit en ligne de commande avec les uti- soient également supprimées automati-
litaires «javac» et «jar» du JDK soit en quement. A contrario, il n’est alors plus
passant par les services d’un IDE. possible de supprimer une classe de
manière unitaire.
La première variante consiste à
charger le fichier JAR de manière stan- dropjava -u user/password@host:port:sid -v HelloWorld.jar
dard. Il suffit pour cela de remplacer
dans la commande «loadjava» le nom
du fichier de la classe par le nom du
fichier JAR:
2
http://java.sun.com/developer/Books/javaprogramming/JAR/basics/manifest.html
SOUG Newsletter 1/2012Tips&techniques 35
Cette commande ne fonctionne que utilisée, consiste à créer un «wrapper»
si le fichier «HelloWorld.jar» se trouve (une enveloppe) PL/SQL qui va servir
dans le répertoire courant. Si celui- de façade pour invoquer une opération
ci n’est plus disponible, il n’est alors d’une classe Java. Seules les méthodes
plus possible de supprimer les clas- statiques de la classe peuvent être en-
ses y relatif qui ont été extraites dans veloppées de cette manière.
le schéma. Il s’agira donc de conserver
précieusement dans un endroit sûr tous CREATE OR REPLACE PROCEDURE helloworldWrapper(pi_firstname IN VARCHAR2)
AS LANGUAGE JAVA NAME ‚ch.hegarc.helloworld.Main.main(java.lang.String[])‘;
les fichiers JAR chargés selon cette va-
riante.
Dès lors, nous pouvons appeler ce
La troisième et dernière variante wrapper comme toute autre procédure
consiste à charger le fichier JAR com- PL/SQL standard.
me une ressource Java. Si cette opti-
on est présente, la base de données va
charger le fichier JAR sans extraire ses
classes. Celles-ci seront toutefois ac-
cessibles, comme nous le verrons plus
loin dans cet article.
loadjava -u user/password@host:port:sid -r -v -f -jarasresource HelloWorld.jar
Il convient de noter que cette pos-
Une petite exploration des objets du sibilité ne s’applique pas si nous avons
schéma de l’utilisateur nous confirme chargé le fichier JAR comme ressource
bien que le fichier JAR a été chargé cet- dans la base de données.
te fois-ci comme un objet de type «Java
Resource». Une deuxième possibilité qui nous
est offerte pour exécuter une classe Java
consiste à utiliser la fonction «RUNJA-
VA» du package «DBMS_JAVA». Cette
fonction permet d’exécuter des classes
Java plus ou moins comme nous le feri-
ons en ligne de commande de manière
classique hors de la base de données.
«JSERVER_SCHEMA» est un mot-
clé qui indique que la classe doit se
trouver dans le schéma de l’utilisateur
Exécution de code «JEANNERETL» dans notre cas. La
Java résidant dans classe Java invoquée peut avoir été
la base de données chargée dans la base de données de
manière individuelle ou au travers d’un
Maintenant que nous avons vu diffé- fichier JAR (standard ou jarasdbob-
rentes méthodes pour charger une clas- jects).
se Java dans la base de données, il faut
nous intéresser à la façon de l’invoquer. L’exemple suivant ne fonctionne
A nouveau, nous allons passer en revue que si la classe Java se trouve dans
les différentes façons de procéder. un fichier JAR chargé comme une res-
source (jarasresource) dans la base de
Afin de rediriger la sortie standard données.
du système Java (System.out) vers ce-
lui de la base de données, nous devons
utiliser la procédure «SET_OUTPUT» du
paquetage DBMS_JAVA. Celle-ci prend
en paramètre la taille du buffer pour gé-
rer la sortie.
La première possibilité, qui est cer-
tainement la plus connue et la plus
SOUG Newsletter 1/201236 Tips&techniques
Conclusion
Pour conclure, nous venons de voir
différentes manières de charger des
classes Java dans la base de données
Oracle et de les invoquer. Nous revien-
drons prochainement dans un autre
article sur des concepts plus avancés
ainsi que sur des cas d’utilisation de
cette technologie peu connue. ■
«JSERVER_CP/RESOURCE/SCHE- shell de commandes qui permet, une
MA» est un mot-clé qui indique que le fois connecté à un schéma, d’exécuter
fichier JAR est une ressource du sché- les classes Java qui y résident comme
ma «JEANNERETL» dans notre cas. nous le ferions en ligne de commande
de manière classique hors de la base de
Enfin, il existe une troisième et données.
dernière possibilité pour exécuter une
classe Java qui consiste à faire appel
en ligne de commande à la comman- ojvmjava -user user/password@host:port:sid
de «ojvmjava». Ce programme est un
Contact
HEG – Haute école de gestion Arc
Philippe Daucourt
E-Mail:
Philippe.Daucourt@he-arc.ch
SMS >>>
Studie von Oracle und PwC:
Telko-CIOs wollen ihre IT 2012 besser ausnutzen
16. November 2011. In Kooperation mit PwC, sie darauf reagieren, indem sie verstärkt auf
einer der führenden Wirtschaftsprüfungs- Outsourcing und Standardisierung setzen.
und Beratungsgesellschaften, hat Oracle 88 Prozent der an der Umfrage beteilig-
die IT-Prioritäten von Telekommunikations- ten CIOs planen für 2012 ein Upgrade ihrer
unternehmen in Europa untersucht. Der CRM-Systeme. Auf diese Weise können sie
Studie zufolge entfallen bei 60 Prozent der sich stärker auf strategische Anwendungen
befragten CIOs derzeit mehr als die Hälfte und Umsatzfaktoren, wie Portal oder Con-
der Betriebskosten auf Wartung. 2012 wollen tent Applications, konzentrieren.
Die ganze Studie: http://www.oracle.com/us/dm/oracle-it-survey-report-401679.pdf
SOUG Newsletter 1/2012Vous pouvez aussi lire