Oracle Java Stored Procedure et JDBC en 5'

Pour accéder aux tables Oracle depuis une classe java stockée dans la base de données, il suffit d’utiliser JDBC et le driver KPRB qui n’est autre que le driver JDBC du serveur. Vous trouverez ci-dessous un exemple très simple d’utilisation de JDBC dans une procédure stockée en Java. Comme vous pourrez le voir, il ne faut pas plus de 5′.

Avant de commencer, il faut noter un certain nombre de choses :

  • d’abord pour transformer une classe Java en Java Store Procedure, il suffit de la charger et de créer un « wrapper » pour y accéder. Ce « wrapper » ne peut se connecter qu’à une méthode statique ce qui parait assez logique si vous avez déjà lancé du Java depuis un autre langage. Bien sur cette méthode peut elle-même instancier des classes… 
  • d’autre part, le driver JDBC interne au serveur donne accès à la session courant ; il est donc inutile d’utiliser un pool de connexions ou de fermer la connexion JDBC même si la méthode close() ne termine pas la session courante

Mais commençons…

Créer une table

Pour les besoins de notre exemple, nous allons créer une table dans le schéma SCOTT :

sqlplus scott/tiger

create table demo(id number, name varchar2(10));

Développer une classe Java

Vous pouvez ensuite développer et charger autant de classes Java que vous voulez. Comme vous pouvez voir ci-dessous avec une classe qui fait un insert dans une table, il n’est absolument pas nécessaire d’utiliser des imports propriétaires à Oracle (bien sur vous pouvez aussi !), cet exemple n’utilise que le JDBC standard qui est chargé par défaut dans JServer :

$ cat DemoService.java 
import java.sql.*;

public class DemoService
{
public static void addDemo (int id, String name) throws SQLException
{
String sql = "INSERT INTO DEMO VALUES (?,?)";
Connection conn = DriverManager.getConnection("jdbc:default:connection:");
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.setString(2, name);
pstmt.executeUpdate();
pstmt.close();
}
}

Charger le source .java dans la base

Vous pouvez charger votre classe Java après l’avoir compilée (avec un JDK 1.5) en base de données. Vous pouvez également directement charger le code source  .java et c’est alors la base de données qui effectuera la compilation avec son propre JDK :

loadjava -u scott -resolve DemoService.java

Password:
*
*****

sqlplus scott/tiger

col object_name format a11
col object_type format a11

select object_name, object_type, status
from user_objects
where object_type like 'JAVA%';

OBJECT_NAME OBJECT_TYPE STATUS
----------- ----------- -------
DemoService JAVA CLASS VALID
DemoService JAVA SOURCE VALID

Créer un wrapper PL/SQL

L’étape suivante consiste à créer un wrapper sur la méthode Java de votre choix. Nous allons utiliser un package mais on peut simplement utiliser une procédure ou une fonction :

sqlplus scott/tiger

CREATE OR REPLACE PACKAGE DemoService AS
PROCEDURE addDemo (id NUMBER, name VARCHAR2);
END DemoService;
/

CREATE OR REPLACE PACKAGE BODY DemoService AS
PROCEDURE addDemo (id NUMBER, name VARCHAR2) AS LANGUAGE JAVA
NAME 'DemoService.addDemo(int, java.lang.String)';
END DemoService;
/

Utiliser la procédure stockée Java

Pour utiliser la procédure stockée, la méthode est strictement identique à l’utilisation d’une procédure stockée PL/SQL :

exec DemoService.adddemo(1,'X');

select * from demo;
ID NAME
-- ----------
1 X


rollback;

select * from demo;

no rows selected

exit

Supprimer la démonstration

Pour supprimer cet exemple, on supprimera la procédure Java de la base de données :

dropjava -u scott DemoService.java

Password:
*
*****

Ainsi que tous les objets créés précédemment :

sqlplus scott/tiger

drop package body DemoService;
drop package DemoService;
drop table demo purge;
exit

Evidemment pour manipuler vos classes, vous préfèrerez sans doute utiliser SQL*Developer ou JDeveloper. Malheureusement Eclipse, y compris avec l’Enterprise Pack Oracle, ne fournit pas d’outil pour aider au développement de Procédures Stockées Java :

Pour en savoir plus, reportez-vous à la documentation Oracle Java Developer’s Guide et la FAQ Oracle. Et arrêtez d’écrire en PL/SQL ?

1 réflexion sur “Oracle Java Stored Procedure et JDBC en 5'”

  1. Merci pour le tuto!
    Est ce qu’on peut appeler n’importe quel Classe Java?
    Par exemple generation d’un fichier XML par un requete stocké en procedure

Les commentaires sont fermés.