Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

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

images/05EC01.png

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.

images/05EC10.png

Création de la table TTEST puis suppression par la procédure Java Supprime_le.

images/05EC11.png

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...