Java dans PL/SQL : Points Clés
1. Objectif
- Intégrer des fonctionnalités Java dans Oracle.
- Exécuter du code Java côté serveur.
- Étendre les capacités de PL/SQL avec des bibliothèques Java.
2. Outils
- loadjava : Charge des classes Java dans la base Oracle.
- dropjava : Supprime des classes Java de la base.
- DBMS_JAVA : Package PL/SQL pour gérer Java dans Oracle.
3. Définition des Privilèges
- Grant JAVAUSERPRIV : Permet d'exécuter du code Java.
- Grant JAVASYSPRIV : Accès aux opérations système (risqué).
- Exemple :
```sql
GRANT JAVAUSERPRIV TO nom_utilisateur;
```
4. Création des Enveloppes PL/SQL
- Fonctions/Procédures PL/SQL appelant du code Java :
```sql
CREATE OR REPLACE FUNCTION nom_fonction RETURN TYPE AS LANGUAGE JAVA NAME
'[Link]() return Type';
```
5. Types de Données Composés
- Objets SQL (Oracle Objects) : Correspondent à des classes Java.
- Collections (VARRAY, TABLE) : Peuvent être mappées avec des tableaux Java.
- SQLJ : Permet un mapping avancé entre SQL et Java.
Choses Importantes à Retenir
- **Performances** : L'appel Java depuis PL/SQL a un coût (privilégier PL/SQL pur si
possible).
- **Sécurité** : Restreindre les privilèges (éviter `JAVASYSPRIV` sauf nécessité).
- **Gestion des erreurs** : Capturer les exceptions Java via PL/SQL (`SQLException`).
- **Portabilité** : Le code Java doit être compatible avec l'environnement Oracle.
**→ Utilisation typique** : Accès à des API externes, traitement complexe, calculs intensifs.
Exemple : Mappage entre Collections PL/SQL (VARRAY, TABLE) et
Tableaux Java
1. Déclaration des Types en PL/SQL
sql
Copy
-- VARRAY (taille fixe)
CREATE TYPE NomVarrayType AS VARRAY(10) OF VARCHAR2(100);
/
-- TABLE (taille dynamique)
CREATE TYPE NomTableType AS TABLE OF NUMBER;
/
2. Classe Java pour Manipuler les Collections
java
Copy
import [Link].*;
import [Link];
import [Link];
import [Link];
public class CollectionHandler {
// Méthode pour traiter un VARRAY (exemple : concaténation)
public static String processVarray(ARRAY varray) throws SQLException {
String[] elements = (String[]) [Link]();
return [Link](", ", elements);
}
// Méthode pour traiter une TABLE (exemple : somme des éléments)
public static double sumTable(ARRAY table) throws SQLException {
BigDecimal[] numbers = (BigDecimal[]) [Link]();
double sum = 0;
for (BigDecimal num : numbers) {
sum += [Link]();
}
return sum;
}
}
3. Enveloppe PL/SQL pour Appeler Java
sql
Copy
-- Pour VARRAY
CREATE OR REPLACE FUNCTION process_plsql_varray(p_array NomVarrayType)
RETURN VARCHAR2 AS LANGUAGE JAVA
NAME '[Link]([Link]) return String';
/
-- Pour TABLE
CREATE OR REPLACE FUNCTION sum_plsql_table(p_table NomTableType)
RETURN NUMBER AS LANGUAGE JAVA
NAME '[Link]([Link]) return double';
/
4. Utilisation depuis PL/SQL
sql
Copy
DECLARE
v_varray NomVarrayType := NomVarrayType('A', 'B', 'C');
v_table NomTableType := NomTableType(10, 20, 30);
v_result_string VARCHAR2(500);
v_result_number NUMBER;
BEGIN
-- Appel Java pour VARRAY
v_result_string := process_plsql_varray(v_varray);
DBMS_OUTPUT.PUT_LINE('VARRAY traité : ' || v_result_string);
-- Appel Java pour TABLE
v_result_number := sum_plsql_table(v_table);
DBMS_OUTPUT.PUT_LINE('Somme de la TABLE : ' || v_result_number);
END;
/
Résultat Attendu
Copy
VARRAY traité : A, B, C
Somme de la TABLE : 60
Points Clés
• Conversion Implicite : Oracle convertit
automatiquement VARRAY/TABLE en [Link].
• Type Java :
o Pour VARRAY OF VARCHAR2 → String[] en Java.
o Pour TABLE OF NUMBER → BigDecimal[] (ou double[] selon le besoin).
• Gestion des Exceptions : Toujours capturer SQLException en Java.
→ Cas d'Usage : Traitement de listes complexes (ex. calculs statistiques, transformations de
données).