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/2012
Tips&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/2012
34 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/2012
Tips&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/2012
36 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/2012
Vous pouvez aussi lire