Java
Introduction
À partir de la version 8i du SGBDR Oracle, le langage Java est totalement intégré au moteur de la base de données. Il va donc être possible d’écrire du code en Java qui sera stocké et exécuté directement dans la base de données.
La machine virtuelle Java intégrée dans le moteur Oracle, est totalement compatible avec le JDK de Sun.
La version du JDK est fixée suivant la version Oracle utilisée.
Cette machine virtuelle s’exécute dans le même processus et partage le même espace mémoire que le moteur de la base de données. Cette solution offre de très bons temps d’accès aux données. La machine virtuelle est un environnement d’exécution Java qui supporte toutes les structures, les méthodes et la gestion des erreurs propres à Java.
Choisir Java pour développer du code côté serveur, c’est obtenir une solution applicative écrite entièrement en Java et donc limiter le nombre de langages différents à apprendre.
Le langage Java peut intervenir pour l’écriture de procédures, de fonctions et de déclencheurs (triggers) de base de données.
Les avantages des procédures stockées sont nombreux. Les plus importants sont :
-
la performance : car le code exécutable est géré...
Chargement des procédures stockées
Avant de pouvoir utiliser les procédures, elles doivent être chargées dans la base de données. Le chargement des procédures et leur publication sont deux étapes distinctes. De nombreuses classes Java sont chargées mais ne sont jamais publiées car elles ne présentent pas d’interface utilisateur.
Ici un utilisateur représente un programmeur PL/SQL.
Pour charger les classes Java dans la base de données, nous utiliserons l’utilitaire en ligne de commandes loadjava.
1. Généralités
Pour chaque classe chargée dans la base de données par loadjava, un objet est créé et le nom de cet objet est issu du nom complet de la classe Java. Dans cet objet sont conservés le code source, le code exécutable et les différentes ressources nécessaires à la bonne exécution de la classe. Loadjava conserve également les différentes valeurs des options dans une table.
Le programme Java peut être mis au point par un outil de développement externe à la base de données, puis le fichier .class est chargé par loadjava. Mais on peut tout à fait charger le fichier source (.java) et le code est alors compilé dans la base de données.
Le nom de l’objet créé reprend le nom complet de la classe Java, c’est-à-dire le nom du package et le nom de la classe. Ces noms peuvent avoir une longueur maximum de 4000 caractères dans la base de données. Mais Oracle autorise des identifiants d’une longueur maximum de 30 caractères pour les objets de la base de données. Il faut donc mettre en place une résolution de nom afin de pouvoir manipuler ces objets depuis PL/SQL.
2. Les droits d’utilisation
Par défaut, les procédures stockées Java utilisent les privilèges accordés à l’utilisateur Oracle qui exécute la procédure. Ce type de résolution de droits permet de personnaliser au mieux les privilèges accordés à chaque utilisateur. De plus, le code peut être centralisé en un point précis de la base de données et être utilisé de différentes façons.
Ce problème est expliqué...
Publication des procédures stockées
Avant de pouvoir utiliser une procédure stockée Java directement depuis SQL, il faut inscrire les références de cette procédure dans le dictionnaire de données. Cette opération n’est pas automatique car le moteur Oracle ne peut pas savoir quelles méthodes seront accessibles depuis le SQL.
Pour une méthode Java, il faut créer une fonction (méthode de type void) ou une procédure PL/SQL à l’aide des ordres CREATE FUNCTION et CREATE PROCEDURE. Ces fonctions et procédures peuvent éventuellement être regroupées dans un package. Le corps de ces fonctions et procédures contiendra la clause LANGUAGE JAVA afin d’enregistrer le nom complet de la méthode, la valeur de retour et les paramètres.
1. Correspondance des types de données
La correspondance entre les types de données SQL et Java est régie par le tableau page suivante.
Type SQL |
Classe Java |
CHAR - NCHAR - LONG - VARCHAR2 - NVARCHAR2 |
oracle.sql.CHAR java.lang.String java.sql.Date java.sql.Time java.sql.Timestamp java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long java.lang.Float java.lang.Double java.lang.BigDecimal byte - short - int - long - float - double |
DATE |
oracle.sql.DATE java.sql.Date java.sql.Time java.sql.Timestamp java.lang.String |
NUMBER |
oracle.sql.NUMBER java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long java.lang.Float java.lang.Double java.lang.BigDecimal byte - short - int - long - float - double |
RAW - LONG RAW |
oracle.sql.RAW byte[] |
ROWID |
oracle.sql.CHAR oracle.sql.ROWID java.lang.String |
BFILE |
oracle.sql.BFILE |
BLOB |
oracle.sql.BLOB oracle.jdbc2.Blob |
CLOB... |
Utilisation des procédures stockées
Après avoir chargé et publié les procédures stockées écrites en Java, il faut les utiliser. Le but de cette section est de montrer les différents moyens possibles pour appeler les procédures Java.
1. Appel d’une procédure Java depuis SQL*Plus
L’instruction CALL
L’instruction CALL permet d’appeler depuis le prompt PL/SQL une procédure stockée Java qui a été publiée en tant que fonction, procédure ou élément d’un package.
Syntaxe
CALL [nom_schéma.][nom_package.]
{nom_procedure(paramètre,...)|nom_fonction(paramètre,...)}
Les paramètres sont définis dans SQL*Plus et peuvent être des littéraux ou bien des variables hôtes.
Exemple
Utilisation de la fonction Compte pour connaître le nombre de clients présents dans la table.
Création de la table TTEST puis suppression par la procédure Java Supprime_le.
Rediriger les sorties
Certaines procédures stockées Java utilisent le flux standard d’erreur (System.err) ou de sortie (System.out) pour afficher certaines informations. Il est possible de rediriger ces flux vers SQL*Plus en utilisant simplement les deux commandes suivantes :
SET SERVEROUTPUT ON [SIZE taille]
CALL dbms_java.set_output(taille)
Avec ce principe, les données sont affichées dès que la procédure est terminée. Le paramètre taille, dont la valeur par défaut est 2000 octets...