Oracle 8i sous Linux



Documents pareils
Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Java DataBaseConnectivity

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Oracle 8i sous Linux

TP Programmation Java / JDBC / Oracle

Introduction à JDBC. Accès aux bases de données en Java

Java et les bases de données

Le Langage SQL version Oracle

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Accès aux bases de données

Programmation d application Bases de données avec Java

Mise en œuvre des serveurs d application

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Module BD et sites WEB

TP1. Outils Java Eléments de correction

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Architectures web/bases de données

RMI le langage Java XII-1 JMF

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

JDBC le langage Java XVI-1 JMF

Compte Rendu d intégration d application

INSTALLATION DE L APPLICATION DU CONTEXTE ITASTE

et Groupe Eyrolles, 2006, ISBN :

Remote Method Invocation (RMI)

2 Chapitre 1 Introduction

OpenPaaS Le réseau social d'entreprise

Développement d applications Internet et réseaux avec LabVIEW. Alexandre STANURSKI National Instruments France

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Mise en oeuvre d'une base de données mono-utilisateur avec SQLite

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Introduction aux Bases de Données Relationnelles Conclusion - 1

Connexion à SQL server

Le modèle client-serveur

Introduction à ORACLE WAREHOUSE BUILDER Cédric du Mouza

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

La base de données XML exist. A. Belaïd

Bien architecturer une application REST

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

25 septembre Migration des accès au Registre national en protocole X.25 vers le protocole TCP/IP, pour les utilisateurs du Registre national

Chapitre I Notions de base et outils de travail

Initiation à SQL. Le langage de communication avec une base de données relationnelles. Application avec PostgreSQL. Nathalie Camelin 2011/2012

La reconquête de vos marges de manœuvre

Java au cœur de la base de données Oracle

FileMaker Pro 13. Utilisation d une Connexion Bureau à distance avec FileMaker Pro 13

TP Contraintes - Triggers

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

1/ Présentation de SQL Server :

FileMaker 13. Guide ODBC et JDBC

Cisco Certified Network Associate

Jérôme FESSY. IUT de Paris 5. Base de Données. Cours Introductif. Base de Données

XML, PMML, SOAP. Rapport. EPITA SCIA Promo janvier Julien Lemoine Alexandre Thibault Nicolas Wiest-Million

Panorama des Bases de Données

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

FileMaker Pro 12. Utilisation d une Connexion Bureau à distance avec FileMaker Pro 12

Programme scientifique Majeure ARCHITECTURE DES SYSTEMES D INFORMATION. Mentions Ingénierie des Systèmes d Information Business Intelligence

Groupe Eyrolles, 2004 ISBN :

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

IFT3030 Base de données. Chapitre 2 Architecture d une base de données

CAHIER DES CHARGES D IMPLANTATION

Cahier des charges (CDC)

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Installation du client

Le langage SQL (première partie) c Olivier Caron

Refonte front-office / back-office - Architecture & Conception -

Architecture Orientée Service, JSON et API REST

Cours Bases de données

WebObjects : des applications dynamiques pour Internet et Intranet. Approche technologique

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

FileMaker 10. Guide ODBC et JDBC

Création d une application JEE

Comment booster vos applications SAP Hana avec SQLSCRIPT

Architecture de la plateforme SBC

Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Initiation aux bases de données (SGBD) Walter RUDAMETKIN

Hébergement de sites Web

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours CCNA 1. Exercices

Programmer en JAVA. par Tama

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

INFORMATIQUE & WEB. PARCOURS CERTIFICAT PROFESSIONNEL Programmation de sites Web. 1 an 7 MODULES. Code du diplôme : CP09

Gestion distribuée (par sockets) de banque en Java

Remote Method Invocation en Java (RMI)

Logiciel de gestion de caisse et d ardoises

Bases de données avancées Introduction

GPC Computer Science

Qu est-ce que ArcGIS?

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Tutoriel XBNE Connexion à un environnement XBMC distant

Transcription:

Oracle 8i sous Linux Gilles Briard Éditions Eyrolles ISBN : 2-212-09135-4 2000

16 Pilotes JDBC et SQLJ Dans ce chapitre nous allons aborder les points suivants : le standard JDBC, les pilotes JDBC d Oracle, SQLJ, simplicité et contraintes. Dans les architectures d applications distribuées, les middlewares jouent un rôle fondamental. Ils permettent l échange de données entre des applications et des bases de données. Pour les applications, une base de données est un espace de stockage performant qui sert à la consultation, à la mise à jour et à l ajout de données. Les standards JDBC et SQLJ ont été créés dans cette optique : ce sont des middlewares destinés aux programmes Java. Ils permettent aux applications Java autonomes ou à des applets Java de communiquer avec des bases de données. Au chapitre 13 ODBC et Oracle Objects pour OLE, nous avons présenté les différents moyens de communication entre une application de l environnement Windows et une base Oracle8i. Outre les pilotes ODBC et la technologie OLE, Oracle propose des pilotes JDBC pour se connecter à Oracle8i à partir de n importe quel programme Java. Par rapport à ODBC, JDBC ajoute la portabilité de Java. Ce chapitre vous explique quand et comment utiliser les pilotes JDBC. Par ailleurs, nous aborderons SQLJ pour montrer comment il est possible d incorporer très facilement des instructions SQL à du code Java.

2 Outils et langages de programmation PARTIE IV Principe des pilotes JDBC Il existe deux types de pilotes JDBC Oracle : les pilotes JDBC utilisés par les machines virtuelles Java standard, un pilote JDBC spécifique pour les méthodes Java exécutées par Oracle JServer. Figure 16-1 Architecture d une application multiniveaux CLIENT «Léger» Applet Java HTTP Serveur d application JDBC Oracle8i Net8 SQL CLIENT «LOURD» PL/SQL Application Java J D B C Net8 Procédures Java La figure précédente montre une architecture dans laquelle JDBC est une interface incontournable. Le modèle présente un déploiement de type client lourd et un déploiement de type client léger. Dans le premier cas, l application Java accède à la base de données via JDBC, qui repose lui-même sur le protocole Net8. Cette application nécessite un poste de travail dit client lourd car elle réalise à la fois des opérations sur les données et l affichage de ces données. Dans le second cas, le client, est par exemple un navigateur Web qui communique avec un serveur d applications selon le protocole HTTP. Le client léger doit uniquement afficher les informations qu il échange avec le serveur d applications ; il ne réalise aucun traitement sur ces données. Le serveur d applications les recueille depuis la base par l intermédiaire d une connexion JDBC et exécute les opérations nécessaires sur ces données. Ensuite, il les transmet au client léger qui les présente à son tour à l utilisateur final. Ces deux catégories de clients, lourd et léger, ont accès à tous les objets stockés dans la base Oracle8i, via les protocoles HTTP et JDBC : tables, procédures stockées PL/SQL et Java, etc. JDBC : les pilotes et leur utilisation JDBC est principalement une bibliothèque de classes Java destinée à faciliter l accès à des données contenues dans des bases relationnelles. Ce n est pas une invention d Oracle, mais une interface standardisée utilisée par de multiples acteurs de l informatique. Toute la difficulté de cette interface consiste à en saisir le «lego logiciel», les différents composants mis en œuvre par telle ou telle implémentation. Les pilotes JDBC sont en effet multiples et utilisent des «chemins d accès» très variés. JDBC a été conçu après ODBC et en reprend bon nombre de caractéristiques : connexion simultanée à plusieurs bases de données, gestion des transactions, interrogations, appel à des

Pilotes JDBC et SQLJ CHAPITRE 16 3 procédures stockées, etc. JDBC ne se contente pas d imiter ODBC : il innove sur des points importants, tel le téléchargement du pilote par le réseau avant son exécution. Le premier pilote JDBC opérationnel, proposé par JavaSoft (la filiale de Sun dédiée aux produits Java), nécessitait l installation de pilotes ODBC pour fonctionner. Cette situation a heureusement évolué. On peut considérer qu il existe trois types de pilotes JDBC : ceux qui réutilisent ODBC ; ceux qui se réfèrent à Net8 ; ceux qui n ont besoin ni d ODBC, ni de Net8. Ces différents accès sont résumés dans le schéma suivant : Figure 16-2 Les différents types de pilotes JDBC Programmes écrits en JAVA accédant à Oracle8i Interface de programmation JDBC Pilote Javasoft utilisant ODBC Pilote ODBC pour Oracle8i Pilote JDBC s appuyant sur Net8 (JDBC-OCI) Pilote JDBC téléchargeable (Thin JDBC) Oracle Net8 Oracle Net8 Sockets de communication JAVA Réseau TCP/IP Réseau vers votre serveur Oracle8i La façon dont vous programmez vos applications Java est unique : elle est définie par les spécifications de l interface de programmation JDBC. À l inverse, lors de l écriture de vos programmes, vous pouvez préciser le type de pilote, donc le chemin que vous souhaitez emprunter pour accéder à Oracle8i. Comment choisir entre les différents JDBC existants L intérêt principal de Java est sa portabilité et ses possibilités de téléchargement d applications. L avantage majeur que les entreprises recherchent dans ces solutions techniques est avant tout l absence de déploiement d applications. Actuellement, il existe des outils de développement très productifs, mais dont l utilisation est limitée par la difficulté de leur installation

4 Outils et langages de programmation PARTIE IV sur les postes des utilisateurs. Même si les applications peuvent être téléchargées après modification, les couches techniques basses comme Net8 doivent être installées sur chaque poste utilisateur. Figure 16-3 Architecture de base Postes clients : Browser Internet, client Linux, Microsoft Serveurs d applications Serveur hébergeant la base Oracle 8i Illustrons nos commentaires au moyen d une architecture à trois niveaux : un poste client équipé d un navigateur, un serveur d applications intermédiaire et un serveur de données hébergeant une base Oracle8i. Voyons, selon ces critères, les différentes solutions existantes. Pilote Javasoft (ou autre) utilisant ODBC C est le moins intéressant des trois. Il a comme seul avantage de valider une solution technique novatrice. Pour fonctionner, il faut installer à la fois l interface JDBC (ajout au langage Java qui interprète les appels JDBC dans vos programmes), un pilote ODBC pour Oracle8i (plus sa configuration) et enfin le «client» Net8 et sa configuration. Cela fait beaucoup! Figure 16-4 Pilote JDBC utilisant ODBC Postes clients : Browser Internet Interface de programmation JDBC Pilote Javasoft utilisant ODBC Pilote ODBC pour Oracle 8i Serveurs d applications Serveur hébergeant la base Oracle 8i Oracle Net8 Oracle Net8 Réseau TCP/IP Réseau TCP/IP

Pilotes JDBC et SQLJ CHAPITRE 16 5 Ce type de pilote alourdit énormément le poste client. Il convient de le réserver à une validation technique ou à des programmes fonctionnant sur des serveurs d applications. Pilote JDBC s appuyant sur Net8 Pour cette architecture, l installation et la configuration locale de Net8 et du pilote JDBC sont nécessaires. Ce pilote se caractérise par une bonne capacité à prendre en charge une charge importante. Figure 16-5 Pilote JDBC s appuyant sur Net8 Postes clients : Browser Internet ou Network Computer Applet (programme) JAVA Serveurs d applications Serveur Web qui télécharge l Applet JAVA Serveur hébergeant la base Oracle 8i JDBC Thin Oracle Net8 Réseau TCP/IP Réseau TCP/IP La solution technique proposée dans ce cas est fort semblable à celle du client-serveur traditionnel. Deux sortes d applications peuvent être visées par ce type de pilote. Envisageons tout d abord celles fonctionnant sur un serveur d applications : le code applicatif mis en œuvre sur le poste client ne gère que l affichage des données et le code autorisant l accès aux données fonctionne sur le serveur d applications. Une seule installation est alors nécessaire, et ce quel que soit le nombre de clients connectés. L autre type d applications concernées sont les applications client ayant un fort besoin d échanges avec la base Oracle8i, à l instar des applications client-serveur actuelles. La lourdeur d installation d un parc important de machines client se justifie par les performances. Pilote téléchargeable Thin JDBC Ce pilote possède un avantage majeur : il ne nécessite pas l installation d un logiciel Oracle sur le poste client et peut être téléchargé par le réseau, sous forme d une applet Java. Techniquement, le code de ce pilote «émule» Net8 et permet une communication directe entre votre poste client et votre base de données Oracle8i. Les limitations techniques du pilote Thin JDBC concernent son volume de chargement, environ 300 Ko hors application Java, qui le rend difficilement utilisable sur des réseaux à faible débit. REMARQUE Pour les «anciens» d Oracle, le pilote Thin JDBC d Oracle n est autre qu une remise au goût du jour de l ancien SQL*Net V1!

6 Outils et langages de programmation PARTIE IV Figure 16-6 Téléchargement d une Applet Postes clients : Browser Internet ou Network Computer Applet (programme) JAVA Serveurs d applications Serveur Web qui télécharge l Applet JAVA Serveur hébergeant la base Oracle 8i JDBC Thin Oracle Net8 Réseau TCP/IP Réseau TCP/IP Pilote JDBC intégré à Oracle JServer Oracle8i est fourni avec JServer, machine virtuelle Java intégrée au serveur de base de données. Comme toute machine virtuelle Java, JServer prend en charge le standard JDBC pour offrir une interface de communication entre une base de données et une application Java. Néanmoins les pilotes JDBC décrits précédemment (JDBC Thin, JDBC OCI) ne sont pas utilisables par les méthodes Java exécutées par JServer. Ces méthodes accèdent à la base via le pilote JDBC embarqué qui garantit de meilleures performances que les pilotes externes à Oracle8i, car il partage les ressources de la base. Il repose sur les bibliothèques natives de la base de données. N importe quelle méthode Java peut être exécutée dans Oracle8i : un développeur d applications trouve un intérêt à déployer dans Oracle8i les classes Java exploitant les données de la base. Le pilote JDBC embarqué fournit la même API que les pilotes JDBC externes : les instructions JDBC prévues pour s exécuter en dehors de la base de données sont strictement identiques aux instructions JDBC qui s exécutent dans Oracle8i. Connexion JDBC à l extérieur d Oracle8i Pour l ouverture une connexion JDBC les méthodes Java qui s exécutent à l extérieur de la base de données doivent spécifier, le nom du pilote JDBC, le nom d utilisateur, le mot de passe de cet utilisateur, les paramètres pour localiser la base de données. Par exemple, la commande suivante établit une connexion JDBC Thin avec la base ORCL, accessible par le port 1521 du serveur unserveur, sous l identité SCOTT/TIGER : DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); connexion conn = DriverManager.getconnexion("<URL>"); où <URL> = jdbc:oracle:thin:scott/tiger@unserveur:1521:orcl

Pilotes JDBC et SQLJ CHAPITRE 16 7 Connexion JDBC dans JServer Lorsqu une méthode Java est exécutée par JServer, son contexte transactionnel est celui de la session courante, la session dans laquelle la méthode est appelée. Au chapitre 17 Java et Oracle8i, nous verrons qu une méthode Java est accessible depuis des instructions SQL ou PL/SQL. Imaginons qu une session SQL*Plus soit ouverte par l utilisateur SCOTT (mot de passe TIGER). Une fois connecté, SCOTT appelle la procédure stockée Java unpackage.getnom(3) qui renvoie le nom de la personne numéro 3. La méthode Java n a pas besoin de spécifier l adresse du serveur, le nom de la base, le nom de l utilisateur, son mot de passe. La méthode Java s exécute dans la session ouverte par SCOTT. Une méthode Java côté serveur est donc toujours connectée à la base données. L objet connexion est créé à partir de la session en cours avec l instruction suivante : connexion conn = new oracle.jdbc.driver.oracledriver.defaultconnexion(); Ensuite des objets Statement, PreparedStatement ou CallableStatement sont créés à partir de l objet conn. SQLJ Depuis longtemps, il est possible de programmer en langage C, C++, Cobol, etc. pour accéder à Oracle. Dans ce but, il existe des «précompilateurs» adaptés au langage utilisé. La mise en œuvre de SQLJ est simple : une balise particulière, #sql, indique l emplacement des instructions SQL intégrées au code Java. Le fichier source Java est alors doté de l extension.sqlj, pour indiquer que ce n est pas un fichier source Java pur. Ce fichier sqlj doit être traité par un précompilateur, dont la tâche est de traduire les instructions SQL en instructions Java. Il génère des fichiers source Java, qui seront compilés par un compilateur Java standard. SQLJ est donc un précompilateur Java qui permet d accéder facilement aux bases de données Oracle8i. SQLJ est un standard pour créer des requêtes SQL plus simplement qu à partir de l API JDBC. Le développeur n a pas besoin d en maîtriser la complexité de JDBC pour écrire des instructions SQL dans un programme Java. Les lignes de code SQLJ sont constituées par des instructions SQL identiques à celles exécutées par des outils comme SQL*Plus. Figure 16-7 Principe de SQLJ Fichier source SQLJ Traducteur SQLJ Fichiers source.java Compilateur Java Fichiers de classe.class Fichiers ressource

8 Outils et langages de programmation PARTIE IV La syntaxe est la suivante : #sql { <requête SQL> ; Par exemple la commande SQLJ correspondant à: SELECT JOB FROM EMP WHERE EMPNO=3; s écrit: #sql {SELECT JOB INTO :empfonction FROM EMP WHERE EMPNO=3; SQLJ et JDBC Comparé à JDBC, SQLJ apporte une grande simplification de la syntaxe : le code est plus lisible ; le nombre de lignes de code est moindre ; la syntaxe SQL des instructions SQLJ est vérifiée pendant la compilation ; la correction des erreurs est simplifiée. Tout programme Java peut exploiter SQLJ, qui peut s utiliser dans les applications client et dans les procédures stockées Java (triggers, méthodes, EJB, objets CORBA). Une méthode Java peut contenir à la fois des appels JDBC et des instructions SQLJ. Comme avec JDBC, les paramètres des instructions SQLJ sont des valeurs littérales ou des variables Java. Un avantage de SQLJ consiste en la vérification syntaxique et en la cohérence avec le schéma de la base de données, au moment de la compilation du code. Si une instruction SQLJ appelle par exemple une procédure PL/SQL inexistante, le traducteur SQLJ le signalera. En revanche, SQLJ nécessite de connaître à l avance la requête qui sera exécutée, alors que JDBC permet de créer dynamiquement des requêtes puisqu une requête JDBC est définie par une chaîne de caractères. L exemple suivant présente la différence entre un code JDBC et le code SQLJ équivalent. Le code de cet exemple : ouvre une connexion dans la base Oracle8i sous l identité SCOTT, recherche la fonction de l employé 7 788, affiche le résultat de la requête, recherche la fonction exercée par chaque employé, affiche la liste des employés, avec leur fonction. Exemple utilisant JDBC Définissons le fichier SalariesJDBC.java : import java.sql.*; public class SalariesJDBC { CONNEXION conn;

Pilotes JDBC et SQLJ CHAPITRE 16 9 public SalariesJDBC() throws SQLException { // Enregistrement du pilote JDBC Oracle DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); //Ouverture d une session dans la base /*Il faut adapter la chaîne unserveur:1521:orcl remplacer unserveur par le nom TCP/IP du serveur de la base remplacer 1521 par le port Net8 de la base remplacer ORCL par le SID de votre base Oracle */ try { conn = DriverManager.getCONNEXION("jdbc:oracle:thin:@unServeur:1521:orcl", "scott","tiger"); catch (SQLException exception) { System.out.println("Impossible d ouvrir la session"); System.err.println(exception) ; System.exit(1); public void requete() throws SQLException { String job; String nom; int empid = 7788; //Recherche du nom et de la fonction du salarié 7 788 //Préparation de la requête PreparedStatement requete = conn.preparestatement("select ename,job from EMP where empno=?"); requete.setint(1,empid); //Exécution de la requête ResultSet resultat = (ResultSet)requete.executeQuery(); //Affichage des résultats while (resultat.next()) { System.out.println("Nom du salarié #"+empid+" : "+resultat.getstring(1)); System.out.println("Fonction du salarié #"+empid+" : "+resultat.getstring(2)); resultat.close(); requete.close();

10 Outils et langages de programmation PARTIE IV //Liste des fonctions de tous les salariés //Préparation de la requête requete = conn.preparestatement("select ename,job from EMP"); //Exécution de la requête resultat = (ResultSet)requête.executeQuery(); //Affichage des résultats System.out.println("Liste des salariés avec leur fonction :"); while (resultat.next()) { System.out.println(resultat.getString(1)+" est un "+resultat.getstring(2)); résultat.close(); requête.close(); public static void main (String [] args) throws SQLException { SalariesJDBC application= new SalariesJDBC(); application.requete(); Exemple identique avec SQLJ Définissons le fichier Salaries.sqlj : import sqlj.runtime.ref.*; import java.sql.*; public class Salaries { /*définition d un itérateur qui contient un champ ename et un champ job pour recevoir des lignes de la table EMP du schéma SCOTT */ #sql iterator liste( String ename, String job ); public Salaries() throws SQLException { //Enregistrement du pilote JDBC Oracle DriverManager.registerDriver(new oracle.jdbc.driver.oracledriver()); //Ouverture d une session dans la base //Définition d un contexte pour les instructions SQLJ

Pilotes JDBC et SQLJ CHAPITRE 16 11 try { CONNEXION conn = DriverManager.getCONNEXION("jdbc:oracle:thin:@unServeur:1521: orcl","scott","tiger"); DefaultContext.setDefaultContext(new DefaultContext(conn)); catch (SQLException exception) { System.out.println("Impossible d ouvrir la session"); System.err.println(exception) ; System.exit(1); public void requete() throws SQLException { String job; String nom; int empid = 7788; //Recherche du nom et de la fonction du salarié 7 788 #sql {SELECT ENAME,JOB into :nom,:job from EMP where empno=:empid; System.out.println("Nom du salarié #"+empid+" : "+nom); System.out.println("Fonction du salarié #"+empid+" : "+job); //Liste des fonctions de tous les salariés liste uneliste; #sql uneliste={select ENAME,JOB from EMP; //Affichage des résultats System.out.println("Liste des salariés avec leur fonction :"); while (uneliste.next()) { System.out.println(uneListe.ename()+" est un "+uneliste.job()); public static void main (String [] args) throws SQLException { Salaries application= new Salaries(); application.requete(); Comparaison du code source JDBC et du code source SQLJ La différence est nette entre les deux codes source Java. Le premier nécessite : la création d un objet PreparedStatement, la création d un objet ResultSet,

12 Outils et langages de programmation PARTIE IV un appel de méthode setint pour affecter la valeur d un paramètre de la requête, un appel de méthode getstring pour récupérer la valeur d une colonne. Le second, avec SQLJ, nécessite : la création d une variable INT pour affecter la valeur d un paramètre de la requête, la création d une variable STRING pour récupérer la valeur d une colonne, le codage d une instruction SQL dans une syntaxe très claire. En outre, le code SQLJ est identique à l instruction SQL qui serait exécutée dans SQL*Plus. Exécution des exemples précédents Avant d exécuter les deux applications, il faut adapter la chaîne de connexion à la base de données, c est à dire : remplacer unserveur par le nom TCP/IP du serveur de la base, remplacer 1521 par le port Net8 de la base, remplacer ORCL par le SID de votre base Oracle. L application SalariesJDBC et l application Salaries produisent le même résultat, à savoir : Nom du salarié #7788 : SCOTT Fonction du salarié #7788 : ANALYST Liste des salariés avec leur fonction : SMITH est un CLERK ALLEN est un SALESMAN WARD est un SALESMAN JONES est un MANAGER MARTIN est un SALESMAN BLAKE est un MANAGER CLARK est un MANAGER SCOTT est un ANALYST KING est un PRESIDENT TURNER est un SALESMAN ADAMS est un CLERK JAMES est un CLERK FORD est un ANALYST MILLER est un CLERK Écrire un fichier SQLJ Comment différencier un fichier source Java utilisant SQLJ d un fichier source n utilisant pas SQLJ? Tout simplement par l extension du fichier source : un fichier source Java utilisant SQLJ porte l extension.sqlj ; un fichier source Java n utilisant pas SQLJ est doté de l extension.java.

Pilotes JDBC et SQLJ CHAPITRE 16 13 Traduire et compiler un fichier sqlj : l utilitaire SQLJ Les compilateurs Java standard (celui de SUN, celui d Oracle8i), ne savent pas compiler directement un fichier source.sqlj. Pour compiler un fichier source.sqlj, un traducteur SQLJ traduit le fichier SQLJ en fichiers source Java et en fichiers de ressource. Ensuite, un compilateur Java standard compile ces fichiers source Java en fichiers.class. Le traducteur se charge de vérifier que les noms des tables, des colonnes et des types de données qui apparaissent dans les requêtes SQLJ sont cohérents avec le schéma relationnel de la base. Oracle8i est fourni avec l utilitaire SQLJ, qui réalise les opérations de génération et la compilation des fichiers.java. Pour que SQLJ fonctionne, la configuration suivante est nécessaire : CLASSPATH doit contenir $(ORACLE_HOME)/sqlj/lib/translator.zip Figure 16-8 Chargement d un fichier SQLJ dans Oracle8i Fichier SQLJ Traducteur SQLJ Fichiers Java Fichiers Class Fichiers Ressource loadjava Oracle8i Traducteur SQLJ embarqué Fichiers Class Fichiers Ressource compilation à l'intérieur de la base compilation à l'extérieur de la base

14 Outils et langages de programmation PARTIE IV La syntaxe de SQLJ est simple : sqlj <nom fichier sqlj> ou pour indiquer sur quel schéma vérifier les requêtes SQL sqlj user=nom/mot de passe@jdbc:oracle:thin:@<url> nom_fichier.sqlj <URL> = <serveur>:<port Net8>:<SID> (ex: localhost:1521:orcl) Par exemple: sqlj exemplesqlj.sqlj Pour déployer un fichier.sqlj dans Oracle8i, Loadjava accepte : les fichiers générés avec l utilitaire SQLJ, le fichier.sqlj. Dans le deuxième cas, l utilitaire Loadjava appellera le traducteur SQLJ interne à la base de données pour générer les sources Java et les fichiers de ressource et compiler ces fichiers. La figure 16-8 montre les deux mécanismes possibles pour charger dans Oracle8i des fichiers SQLJ. SQLJ côté serveur Aucune modification du code Java n est nécessaire, si le code SQLJ s exécute dans la base de données : la syntaxe est identique. La seule différence entre une méthode s exécutant à l extérieur d Oracle8i et une méthode s exécutant à l intérieur d Oracle8i concerne l ouverture de session. Lorsque le code SQLJ est traité par JServer, la session est implicitement la session en cours, comme pour les opérations JDBC. Dans ce cas, il n est donc pas nécessaire de réaliser une ouverture de session. Côté serveur, SQLJ présente une restriction : les instructions SQLJ ne s appliquent que sur la base de données où la méthode Java s exécute ; une base distante n est pas accessible par des commandes SQLJ. Le code du fichier SalariesKPRB.sqlj se présente comme suit : import sqlj.runtime.ref.*; import java.sql.*; public class SalariesKPRB { public SalariesKPRB() throws SQLException { public static String requete(int empid) throws SQLException { String job; String nom; #sql {SELECT ENAME,JOB into :nom,:job from EMP where empno=:empid; System.out.println("Nom du salarié #"+empid+" : "+nom); System.out.println("Fonction du salarié #"+empid+" : "+job); return new String("#"+empId+" : "+nom+" - "+job);

Pilotes JDBC et SQLJ CHAPITRE 16 15 La classe SalariesKPRB est prévue pour fonctionner dans Oracle8i, ce qui explique l absence d ouverture de session. Elle comprend la méthode requete, qui prend comme argument le numéro d un employé et renvoie une chaîne de caractères indiquant le nom et la fonction de cet employé. La requête SELECT est exécutée sur la table EMP du schéma courant. Pour cet exemple, il faudra se connecter sous SCOTT afin d exécuter la méthode Java. Nous compilons ce fichier avec SQLJ. sqlj SalariesKPRB.sqlj Trois fichiers sont générés, à savoir : SalariesKPRB.class, un fichier de classe Java ; SalariesKPRB_SJProfile0.ser, un fichier de ressource Java ; SalariesKPRB_SJProfileKeys.class, un fichier de classe Java. Ensuite nous déployons ces fichiers dans Oracle8i pour pouvoir appeler la méthode requete comme une procédure stockée Java. Les étapes de mise en oeuvre des procédures stockées Java seront présentées au chapitre 17 Java et Oracle 8i. Pour déployer les fichiers dans Oracle8i, il faut procéder comme suit : loadjava resolve thin user scott/tiger@unserveur:1521:orcl SalariesKPRB.class SalariesKPRB_SJProfile0.ser SalariesKPRB_SJProfileKeys.class La méthode Java requete est publiée en tant que fonction PL/SQL sous le nom SalariesNomJob : sqlplus scott/tiger CREATE OR REPLACE FUNCTION SalariesNomJob(p0 NUMBER) RETURN VARCHAR2 AS LANGUAGE JAVA NAME SalariesKPRB.requete(int) return java.lang.string ; Pour tester cette méthode, il convient de : se connecter à la base en tant que SCOTT/TIGER ; paramétrer SQL*PLUS pour qu il affiche les sorties envoyés sur System.out ; appeler la fonction SalariesNomJob. Voici le détail des commandes à lancer dans SQL*PLUS : SQL> set serveroutput on SQL> call dbms_java.set_output(2000); SQL> VARIABLE chaine VARCHAR2(80); SQL> call SalariesNomJob(7839) into :chaine; Nom du salarié #7839 : KINGFonction du salarié #7839 : PRESIDENT Appel terminé. SQL> print chaine; CHAINE ----------------------------------------------- #7839 : KING - PRESIDENT

16 Outils et langages de programmation PARTIE IV Résumé JDBC est le standard indispensable pour réaliser la communication entre un programme Java (applet ou application) et une base de données. Contrairement à ODBC, l API JDBC est portable sur toutes les plates-formes prenant en charge Java. Nous avons montré que JDBC présente quelques difficultés d utilisation. Le standard SQLJ corrige ce défaut en proposant une interface moins complexe pour accéder à une base.