Vous êtes sur la page 1sur 102

KWWSZZZDGHOHLPDJIUaGRQVH]FRXUV

Programmation Procdurale
et SQL

Didier DONSEZ
Universit Joseph Fourier
IMA IMAG/LSR/ADELE
'LGLHU'RQVH]#LPDJIU
'LGLHU'RQVH]#LHHHRUJ



Motivations (i)
Limites de SQL
Langage dclaratif (non procdural)
facile d exprimer des requtes
MAIS pas de structure de contrle
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

boucle itrative, contrle squentiel

Il existe parfois une solution en pur SQL


Exemple du puzzle de Joe Celko
Certes, il faut se creuser la tte

Sinon

Langage Procdural + SQL



Motivations (ii)
Besoins
Procdure
variables locales
structures de contrle
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

ERXFOHLWpUDWLYHWHVWH[FHSWLRQ

parcours du rsultat d une requte ligne ligne


FXUVHXU
LPEULFDWLRQGHVSDUFRXUV FXUVHXUVLPEULTXpV

Excution
par le client / par le serveur

Curseur

Pointeur sur la ligne courante


Transfert des valeurs
entre la ligne pointe et les variables de la procdure



3 Solutions
SQL Dynamique
Interface SQL/CLI et Middleware ODBC et JDBC

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Embedded SQL in 3GL


SQL Procdural



Remarque 1:

Problme de l Impedance Mismatch


Typage diffrent entre SQL et C, C++, Java, ...
conversion, arithmtique

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

180%(5 [
'(&,0$/ [\ 180%(5 [\
9$5&+$5 [

LQW"ORQJ"
IORDW "GRXEOH"
FKDU>[@"VWULQJ"

constructeur de type

Les valeurs NULL

reprsentent les valeurs manquantes ou non renseignes

absente des langages htes

Logique 3 niveaux

758(81.12:)$/6(

18//   18// ,681.12:



Remarque 2:

Risques de la programmation procdurale


La solution SQL pur n est pas trivial
le dveloppeur propose une solution procdurale
suite de plusieurs requtes SQL

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

le dveloppeur se substitue parfois l optimiseur

Exemple

imbrication de curseurs sur deux tables


pour raliser une jointure

Interface SQL/CLI
et Middleware ODBC et JDBC
Motivations
Dynamic SQL
SQL/CLI
ODBC
JDBC
DBI pour PERL
Avantages et Inconvnients



Motivations
Connexions simultanes vers plusieurs bases
Consultation et Modification
La requte n est analyse qu l excution
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

son code SQL peut tre gnr ou saisis qu l excution

2 formes
Dynamic SQL
utilisation de sections (proche d Embedded SQL)
ncessite un prcompilateur

SQL/CLI
API bas niveau pour les applications



Dynamic SQL
Requtes SQL

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

chane de caractres dcrivant la requte SQL


la requte est analyse (PREPARE) l excution
puis excute (EXECUTE)
- Erreur de Syntaxe
- + Absence de la source de donnes
+ Gnration automatique de requtes

Exemple en C

EXEC SQL BEGIN DECLARE SECTION;


char requete[MAX_QUERY_LENGTH];
EXEC SQL END DECLARE SECTION;
while(1) {
printf("\nNouvelle requte:"); scanf("%s",requete);
EXEC SQL 35(3$5( q FROM : requete;
EXEC SQL (;(&87( q;
printf("\nNouvelle requte:"); scanf("%s",requete);
EXEC SQL (;(&87(,00(',$7( : requete;
}



10

L interface SQL/CLI
CLI : Call Level Interface

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

API normalis par l ANSI

Evolution dans SQL3, dans Oracle 8, ...


prise en compte des extensions Objet



11

Les Middlewares SQL/CLI


Plusieurs Offres
ODBC

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

SQL/CLI

Open DataBase Connectivity (MicroSoft)

JDBC
Java DataBase Connectivity (JavaSoft)
SQL/CLI
IDAPI
Integrated Database Application
Interface (Borland)
DAL
Data Access Language (DEC/Apple)
DRDA
Distributed Remote Database Access
(IBM/XOpen)
A
fichiers
P
U SQL*Net
(Oracle)Adapteur IDAPI
P
T
I
L
I
S
A
T
E
U
R

L
I
C
A
T
I
O
N
S

API

Outils
Interactif

I
D
A
P
I

pour DBase

Adapteur IDAPI
pour SQL*Net
Adapteur Driver ODBC
pour Oracle
IDAPI
pour
Driver ODBC
ODBC pour MSAccess

locaux

TCP/IP

Serveur
ORACLE

fichiers
locaux



ODBC 2SHQ 'DWD%DVH&RQQHFWLYLW\

Objectif

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Le "MiddleWare" offre une interface unique d'


accder aux
donnes quelque soit le format, la localisation, ...
Indpendance Application / Serveurs BD
(MultiVendeurs)

Principes

abstractions/concepts de SQL/CLI (ISO et ANSI)


API MS Windows pour manipuler des Tables SQL
dans des fichiers locaux
servies par des serveurs SGBD Relationnels
en mode Client/Serveur

plusieurs sources accessibles simultanment

12



13

Architecture d ODBC
Architecture Modulaire
utilisant des drivers d adaptation

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

au format de la source de donnes


au moyen d accs (protocole rseau, fichier local)
U

TCP/IP

L
I

API

SQL/NET

Outils

Interactifs

O
D
B
C

Driver ODBC
pour Oracle
Driver ODBC
pour MS Access
Driver ODBC
pour CQL

SGF

L
E
C
T
E
U
R

Serveur Oracle

Base
Distante
Fichier
Local

ISO 7816-7

Carte GEMxCOS

Base
CQL

Configuration des sources ODBC



'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

14



MicroSoft ADO $FWLYH; 'DWD2EMHW

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Composant ActiveX

15



ADO dans un ASP (i)

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

3DUFRXUVG XQHWDEOHDYHFXQFXUVHXU
#/$1*8$*( -6FULSW !
LQFOXGH ILOH DGRMDYDVLQF!
+70/!+($'!7,7/(!5HTXrWH6LPSOH7,7/(!+($'!%2'<!
K!/LVWHGHV$XWHXUVK!KU!

YDUFXU'LU 6HUYHU0DS3DWK ??LLVVDPSOHV??VGN??DVS??GDWDEDVH??DXWKRUVPGE 
YDUR&RQQ 6HUYHU&UHDWH2EMHFW $'2'%&RQQHFWLRQ 
R&RQQ2SHQ '%4 FXU'LU'ULYHU ^0LFURVRIW$FFHVV'ULYHU PGE `
'ULYHU,G ),/ 06$FFHVV
YDUR5V R&RQQ([HFXWH 6(/(&7 )URPDXWKRUV 
!
7$%/(ERUGHU !
 ZKLOH R5VHRI ^!
WU!
IRU ,QGH[ ,QGH[ R5VILHOGVFRXQW ,QGH[ ^!
7' 9$OLJQ WRS! R5V ,QGH[ !7'!
`!
WU!
R5V0RYH1H[W 
`!
7$%/(!
R5VFORVH  R&RQQFORVH !
%2'<!+70/!

16



ADO dans un ASP (ii)

17

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

$MRXWHW6XSSUHVVLRQG XQHOLJQH

K!6XSSUHVVLRQHW$MRXWG XQDXWHXUK!KU!

R5V 6HUYHU&UHDWH2EMHFW $'2'%5HFRUGVHW 
R5V$FWLYH&RQQHFWLRQ R&RQQ
R5V6RXUFH 6(/(&7 )520 DXWKRUV:KHUH  
R5V&XUVRU7\SH DG2SHQ6WDWLFR5V/RFN7\SH DG/RFN2SWLPLVWLF
R5V2SHQ R5V$GGQHZ 
R5V $XWKRU 9DOXH -RKQ6WHLQEHFN
R5V <HDU%RUQ 9DOXH 
R5V8SGDWH 
5HVSRQVH:ULWH S!$XWHXU ,QVHUpR5V $XWKRU R5V <HDU%RUQ R5V&ORVH 
R5V 6HUYHU&UHDWH2EMHFW $'2'%5HFRUGVHW 
R5V$FWLYH&RQQHFWLRQ R&RQQ
R5V6RXUFH 6(/(&7 )520 DXWKRUV :+(5( <HDU%RUQ DQG $XWKRU
-RKQ6WHLQEHFN

R5V&XUVRU7\SH DG2SHQ)RUZDUG2QO\ R5V/RFN7\SH DG/RFN2SWLPLVWLF
R5V2SHQ R5V'HOHWH R5V8SGDWH 
5HVSRQVH:ULWH S!$XWHXU6XSSULPp3DXO(QILHOG 
R5V&ORVH 
!
%2'<!+70/!



ADO dans un ASP (iii)

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

,QYRFDWLRQG XQH3URFpGXUH6WRFNpH
#/$1*8$*( -6FULSW !
LQFOXGH ILOH DGRMDYDVLQF!
+70/!+($'!7,7/(!,QYRFDWLRQG XQHSURFpGXUHVWRFNp7,7/(!+($'!
%2'<!
K!,QYRFDWLRQG XQHSURFpGXUHVWRFNpK!KU!

YDUR&RQQ 6HUYHU&UHDWH2EMHFW $'2'%&RQQHFWLRQ 
YDUR&PG 6HUYHU&UHDWH2EMHFW $'2'%&RPPDQG 
R&RQQ2SHQ '61 /RFDO6HUYHU8,' VD3:' '$7$%$6( SXEV 
R&PG$FWLYH&RQQHFWLRQ R&RQQ
R&PG&RPPDQG7H[W ^FDOO E\UR\DOW\ " `
R&PG3DUDPHWHUV$SSHQG R
&PG&UHDWH3DUDPHWHU #3HUFHQWDJH DG,QWHJHU DG3DUDP,QSXW 
R&PG #3HUFHQWDJH  
YDUR5V R&PG([HFXWH 
!
,'GHO
DXWHXU  5HVSRQVH:ULWH R5V DXBLG !%5!
%2'<!+70/!

18



JDBC

-DYD'DWD%DVH&RQQHFWLYLW\
Motivations
API Java pour manipuler des Tables SQL

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

dans des fichiers locaux


servies par un serveur BD

une seule API uniforme


pour tous les SGBDs (relationnels)
abstractions/concepts de X/Open SQL Call Level Intf
Mme principe que les Middlewares comme ODBC

19



20

Architecture JDBC
Composants dadaptation (Drivers)

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

un driver pour chaque SGBD (Oracle, Sybase, ...)


un driver pour chaque format de fichier (Dbase,Paradox)

Driver JDBC
pour DBase

$SSOL 
HQ-DYD

JDBC
Mng
$SSOL 
HQ-DYD

Driver JDBC
pour SQL*Net
Driver ODBC
Pont
pour Oracle
JDBC
/
Driver ODBC
ODBC pour MSAccess

fichiers
locaux
Serveur
ORACLE
TCP/IP

fichiers
locaux



21

Drivers JDBC
4 types de drivers JDBC
pur Java

+ DONC tlchargeable

natif
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

- installation du driver sur le client

pont JDBC / ODBC

- installation d ODBC et des drivers sur le client


+ utilisation des drivers ODBC existants

serveur Middleware

- encombrement serveur
+ protocole autre que TCP/IP



22

Drivers JDBC :
pur Java vs Natif
$SSOLFDWLRQ$SSOHW

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

-'%&0DQDJHU

$SSOLFDWLRQ$SSOHW
-'%&0DQDJHU
'ULYHU-DYD

'ULYHUHQSXU-DYD

$3,1DWLYH&OLHQW%'
&&

6HUYHXU%'

6HUYHXU%'



23

Drivers JDBC :
pont ODBC vs Middleware
$SSOLFDWLRQ$SSOHW

$SSOLFDWLRQ$SSOHW

'ULYHU-DYD2'%&
3RQW-'%&2'%& &

'ULYHU-DYD
&OLHQW0LGGOHZDUH

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

-'%&0DQDJHU

'ULYHU2'%& &&

-'%&0DQDJHU

6HUYHXU 0LGGOHZDUH
$3,&OLHQW%'

6HUYHXU%'

2'%& 0QJ
'ULYHU2'%&

6HUYHXU%'



3DFNDJHMDYDVTO

Interfaces
DriverManager
Connection, PooledConnection, XAConnection
Statement

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

PreparedStatement
CallableStatement

ResultSet
ResultSetMetaData
DatabaseMetaData
RowSet
SQLData, SQLInput, SQLOutput

Classes

DriverManager, DriverPropertyInfo
Date, Time, TimeStamp, Types, Struct,
64/([FHSWLRQ64/:DUQLQJ'DWD7UXQFDWLRQ

24



25

Connexion JDBC

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

classe java.sql.Connection
URL dune source de donnes (relationnelle)
jdbc:<subprotocol>:<subname>
jdbc:dcenaming:accounts-payable
jdbc:dbnet://dbms.mycomp.com:356/ecom
jdbc:msql://dbsv.acme.com/user
jdbc:oracle:thin:@enee:1521:ISTV
jdbc:odbc:ECOM
jdbc:odbc:ECOM;CacheSize=20;ExtensionCase=LOWER
jdbc:odbc:ECOM;UID=admin;PWD=nimda
jdbc:GemDBJdbc:/1F00/1F10
...

Extension JDBC3.0

aux fichiers plats et aux feuilles de calcul



26

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

JDBC &XUVHXU
FODVV (PSOR\H ^
SXEOLFVWDWLFYRLG PDLQ 6WULQJ DUJV >@
WKURZV 64/([FHSWLRQ &ODVV1RW)RXQG([FHSWLRQ ^WU\^
&ODVVIRU1DPH RUDFOHMGEFGULYHU2UDFOH'ULYHU 
&ODVVIRU1DPH VXQMGEFRGEF-GEF2GEF'ULYHU 
6WULQJ GEXUO MGEFRUDFOHRFL#
&RQQHFWLRQFRQQ 'ULYHU0DQDJHUJHW&RQQHFWLRQ GEXUOWRWRSDVVHPRW 
6WDWHPHQWVWPW FRQFUHDWH6WDWHPHQW 
5HVXOW6HWUV VWPWH[HFXWH4XHU\
6(/(&7 QXPHPS QDPH VDODU\ )520(03/2<( 
ZKLOH UVQH[W ^
6WULQJV UVJHW6WULQJ  
IORDW I UVJHW)ORDW VDODU\ 
6\VWHPRXWSULQWOQ VJDJQHI 
`UVFORVH 
`FDWFK ([FHSWLRQH ^HSULQW6WDFN7UDFH ``



27

JDBC YDOHXUQXOOH

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Rappel
une valeur nulle (NULL) en SQL signifie :
valeur inconnue, valeur non renseigne, ...
5HVXOW6HWUV VWPWH[HFXWH4XHU\
6(/(&7 QXPHPS QDPH VDODU\ )520(03/2<( 
ZKLOH UVQH[W ^6WULQJV UVJHW6WULQJ  
IORDW I UVJHW)ORDW VDODU\ 
LI UVZDV1XOO 6\VWHPRXWSULQWOQ VQ

DSDVGHVDODLUH 
HOVH
6\VWHPRXWSULQWOQ VJDJQHI 
` UVFORVH 

Remarque

la mthode isNull() de JDBC0.5 permettait


LI UVLV1XOO  6\VWHPRXWSULQWOQ VQ

DSDVGHVDODLUH 
HOVH
6\VWHPRXWSULQWOQ VJDJQHUVJHW)ORDW   
cependant l implantation tant difficile, elle a t abandonne



JDBC

28

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

SDVVDJHG DUJXPHQWVPRGLILFDWLRQWUDQVDFWLRQ
FODVV (PSOR\H ^

SXEOLFVWDWLFLQW XSGDWH(PSOR\H LQWQXP6WULQJQRP
WKURZV 64/([FHSWLRQ &ODVV1RW)RXQG([FHSWLRQ ^WU\^
&ODVVIRU1DPH RUDFOHMGEFGULYHU2UDFOH'ULYHU 
6WULQJ GEXUO MGEFRUDFOHRFL#
&RQQHFWLRQFRQQ 'ULYHU0DQDJHUJHW&RQQHFWLRQ GEXUOWRWRSDVVHPRW 
FRQQVHW$XWR&RPPLW IDOVH 
3UHSDUHG6WDWHPHQW SVWPW FRQQSUHSDUH6WDWHPHQW 

83'$7((PSOR\H 6(7VDODU\ "QDPH ":+(5(QXPHPS "


SVPWFOHDU3DUDPHWHUV 
SVPWVHW1XOO   SVPWVHW6WULQJ QRP SVPWVHW,QW QXP 
LQWQE/LJQHV0RGLILHHV SVPWH[HFXWH8SGDWH 
LI QE/LJQHV0RGLILHHV  FRQQFRPPLW HOVH FRQQUROOEDFN 
`FDWFK ([FHSWLRQH ^
HSULQW6WDFN7UDFH ``



29

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

JDBC DSSHOG XQHSURFpGXUHVWRFNpH


FODVV (PSOR\H ^

SXEOLFVWDWLFLQW SD\UDLVH &RQQHFWLRQFRQQLQWQXP
WKURZV 64/([FHSWLRQ^ WU\ ^
&DOODEOH6WDWHPHQW FVWPW FRQQSUHSDUH&DOO ^FDOO VSBSD\UDLVH "" ` 
FVWPWUHJLVWHU2XW3DUDPHWHU MDYDVTO7\SHV,17 
SVPWVHW,QW QXP 
FVPWH[HFXWH 
UHWXUQ FVWPWJHW,QW  
`FDWFK ([FHSWLRQH ^
HSULQW6WDFN7UDFH ``



JDBC

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

6WUHDPV$6&,,HW%LQDLUHV
FODVV (PSOR\H ^
SXEOLF VWDWLFYRLG LQIR &RQQHFWLRQFRQQ LQWQXP
WKURZV 64/([FHSWLRQ^WU\ ^
6WDWHPHQWVWPW FRQFUHDWH6WDWHPHQW 
5HVXOW6HWUV VWPWH[HFXWH4XHU\
6(/(&7 QDPHSKRWR FY )520(03/2<( 
ZKLOH UVQH[W ^
6WULQJV UVJHW6WULQJ  
%XIIHUHG5HDGHUFY QHZ %XIIHUHG5HDGHU
QHZ ,QSXW6WUHDP5HDGHU UVJHW$VFLL6WUHDP FY 
ZKLOH FYUHDG\ ^RXWSULQWOQ FYUHDGOLQH `
%XIIHUHG,QSXW6WUHDPJLI'DWD QHZ %XIIHUHG,QSXW6WUHDP
QHZ %LQDU\,QSXW6WUHDP UVJHW%LQDU\6WUHDP SKRWR 
ZKLOH OHQ JLI'DWDUHDG EXIEXIOHQJWK   ^

`
`UVFORVH 

30



31

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

JDBC 5HVXOW6HW0HWD'DWD
FODVV+70/5HVXOW6HW^/LYUH6HUYOHW([S
SULYDWH5HVXOW6HWUV
SXEOLF+70/5HVXOW6HW 5HVXOW6HWUV ^WKLVUV UV`
SXEOLF6WULQJ WR6WULQJ ^
6WULQJ%XIIHURXW QHZ 6WULQJ%XIIHU RXWDSSHQG 7$%/(! 
5HVXOW6HW0HWD'DWD UVPG UVJHW0HWD'DWD 
LQWQXPFROV UVPGJHW&ROXPQ&RXQW 
RXWDSSHQG 75! 
IRU LQWL LQXPFROVL ^
RXWDSSHQG 7+! DSSHQG UVPGJHW&ROXPQ/DEHO L 
`
RXWDSSHQG 75! 



JDBC

JHW2EMHFW

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

VXLWHGH+70/5HVXOW6HWWR6WULQJ



ZKLOH UVQH[W ^
RXWDSSHQG 75! 
IRU LQW L LQXPFROVL ^
RXWDSSHQG 7+! 
2EMHFWREM UVJHW2EMHFW L 
RXWDSSHQG REM QXOO " QEVSREMWR6WULQJ 
RXWDSSHQG 7+! 
`
RXWDSSHQG 75!
`
RXWDSSHQG 7$%/(! 

32



33

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

JDBC JHW2EMHFW
5HVXOW6HWUV VWPWH[HFXWH4XHU\
6(/(&7 QXPHPS QDPH VDODU\ )520(03/2<( 

ZKLOH UVQH[W ^
6WULQJV UVJHW6WULQJ  
IORDW I UVJHW)ORDW VDODU\ 
LI UVZDV1XOO HOVHZDV1XOO WHVWHVLODGHUQLqUHYDOHXUHVW18//
`

ZKLOH UVQH[W ^DOWHUQDWLYHDYHFJHW2EMHFW


2EMHFWREM
REM UVJHW2EMHFW  6WULQJV REMWR6WULQJ 
REM UVJHW2EMHFW VDODU\ 
LI REM QXOO HOVH^WHVWHVLODYDOHXUHVW18//
)ORDW I  )ORDW REMSHXWOHYHU&DVW([FHSWLRQ
``



34

Correspondance de type SQL-Java (i)


7\SH64/

180(5,&

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

'(&,0$/
%,7
7,1<,17
60$//,17
,17(*(5
%,*,17
5($/
)/2$7
'28%/(

7\SH-DYD

7\SH-DYD
UHWRXUQpSDUJHW2EMHFW

0pWKRGHUHFRPPDQGpH
DXOLHXGHJHW2EMHFW

MDYD0DWK%LJ'HFLPDO MDYD0DWK%LJ'HFLPDO MDYD0DWK%LJ'HFLPDO


JHW%LJ'HFLPDO
MDYD0DWK%LJ'HFLPDO MDYD0DWK%LJ'HFLPDO MDYD0DWK%LJ'HFLPDO
JHW%LJ'HFLPDO
ERROHDQJHW%RROHDQ
ERROHDQ
%RROHDQ
E\WH JHW%\WH
E\WH
,QWHJHU
VKRUWJHW6KRUW
VKRUW
,QWHJHU
LQWHJHUJHW,QW
LQWHJHU
,QWHJHU
ORQJJHW/RQJ
ORQJ
/RQJ
IORDWJHW)ORDW
IORDW
)ORDW
GRXEOHJHW'RXEOH
GRXEOH
'RXEOH
GRXEOH JHW'RXEOH
GRXEOH
'RXEOH
'RLWrWUHXWLOLVpSRXUOHVYDOHXUV
PRQpWDLUHV SOXW{WTXH)ORDW



35

Correspondance de type SQL-Java (ii)


7\SH64/

7\SH-DYD
UHWRXUQpSDUJHW2EMHFW

6WULQJ
6WULQJ
6WULQJ

6WULQJ
6WULQJ
6WULQJ

%,1$5<
E\WH>@
9$5%,1$5<
E\WH>@
/21*9$5%,1$5< E\WH>@

E\WH>@
E\WH>@
E\WH>@

'$7(
7,0(
7,0(67$03

MDYDVTO'DWH
MDYDVTO7LPH
MDYDVTO7LPHVWDPS

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

&+$5
9$5&+$5
/21*9$5&+$5

7\SH-DYD

MDYDVTO'DWH
MDYDVTO7LPH
MDYDVTO7LPHVWDPS

0pWKRGHUHFRPPDQGpH
DXOLHXGHJHW2EMHFW

6WULQJ JHW6WULQJ
6WULQJ JHW6WULQJ
,QSXW6WUHDP
JHW$VFLL6WUHDP
,QSXW6WUHDP
JHW8QLFRGH6WUHDP
E\WH>@JHW%\WHV
E\WH>@JHW%\WHV
,QSXW6WUHDP
JHW%LQDU\6WUHDP
MDYDVTO'DWHJHW'DWH
MDYDVTO7LPHJHW7LPH
MDYDVTO7LPHVWDPS
JHW7LPHVWDPS



36

Nouveaux types dans JDBC3.0


BOOLEAN
DATALINK
Prise en chaque de donnes externes au SGBD
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

(fichier d images, )



Les exceptions dans JDBC

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

64/([FHSWLRQ64/:DUQLQJ'DWD7UXQFDWLRQ

WU\ ^
3UHSDUHG6WDWHPHQWSVWPW FRQQSUHSDUH6WDWHPHQW 

83'$7( (PSOR\H 6(7 VDODU\ " QDPH ":+(5( QXPHPS "


SVPWVHW1XOO   SVPWVHW6WULQJ QRP  SVPWVHW,QW  QXP 
QE/LJQHV0RGLILHHV SVPWH[HFXWH8SGDWH 
`
FDWFK 'DWD7UXQFDWLRQ H ^
'HVGRQQpHVRQWpWpWURQTXpHVRQGpFLGHGHQHULHQIDLUH
`
FDWFK 64/([FHSWLRQH ^
6\VWHPRXWSULQWOQ HJHW0HVVDJH 
ZKLOH H HJHW1H[W([FHSWLRQ  QXOO ^
6\VWHPRXWSULQWOQ HJHW0HVVDJH 
`
`

37



38

Evolution de JDBC
JDBC 1.0 (Janvier 1996)
JDBC 2.0 (Mars 1998)
JDBC 3.0 (Septembre 2000)

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Extensions de JDBC 2.x CORE et SE (Standard Exception)

Parcours avant-arrire d un ResultSet


Mise jour depuis un ResultSet
Batch de plusieurs ordres
SQL3 datatypes
les types tendus UDT (SQL_DATA) et rfrences REF
les types longs (BLOB, CLOB) et les ARRAY

Validation deux phases des transactions (XA)


Pool de connexion, Cache de lignes sur le client
RowSet (Composants JavaBean),
DataSource et JNDI



'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Echapement SQL
dans les Statements
6WDWHPHQWVWPW FRQFUHDWH6WDWHPHQW 
VWPWVHW(VFDSH3URFHVVLQJ WUXH 
5HVXOW6HWUV
 HFKDSHPHQW GHZLOGFDUG64/BHW
UV VWPWH[HFXWH4XHU\ 6(/(&7QXPHPS )520(03/2<(
:+(5(QDPH /,.(
??B
^HVFDSH
??
` 
DSSHOjGHVIRQFWLRQVGX6*%'
UV VWPWH[HFXWH4XHU\ 6(/(&7 QXPHPS )520(03/2<(
:+(5( QDPH ^IQXVHU ` 
MRLQWXUHH[WHUQH
UV VWPWH[HFXWH4XHU\ 6(/(&7 QXPHPS680 DPRXQW 
)520^RM (03/2<(/()7287(5-2,16$/(86,1* QXPHPS ` 
DSSHOGHSURFpGXUHVWRFNpH
^" FDOO SURFHGXUHBQDPH> """" @`
^FDOO SURFHGXUHBQDPH> """" @`

39



40

Positionnement dans un ResultSet

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Mthodes : first , last , beforeFirst , afterLast,


absolute, previous , relative , moveToCurrentRow
6WDWHPHQWVWPW FRQFUHDWH6WDWHPHQW 5HVXOW6HW7<3(B6&52//B6(16,7,9(
5HVXOW6HW&21&85B83'$7($%/( 
5HVXOW6HWUV VWPWH[HFXWH4XHU\ 6(/(&7 )520(PSOR\H 
UVILUVW 
UVXSGDWH)ORDW 6DODU\I 
UVDEVROXWH  
)ORDW VDO UVJHW)ORDW 6DODU\VDO 
UVXSGDWH)ORDW VDO  
UVUHODWLYH  UVSUHYLRXV 
UVXSGDWH)ORDW 6DODU\I 

UVXSGDWH5RZ 
UVXSGDWH5RZ 
UVXSGDWH5RZ 



41

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Mise jour depuis Java


6WDWHPHQWVWPW FRQFUHDWH6WDWHPHQW 5HVXOW6HW7<3(B6&52//B6(16,7,9(
5HVXOW6HW&21&85B83'$7($%/( 
5HVXOW6HWXSUV VWPWH[HFXWH4XHU\
83'$7((PSOR\H6(76DODU\ :+(5(1XP(PS  
XSUVODVW 
XSUVXSGDWH)ORDW 6DODU\ 
XSUVFDQFHO5RZ8SGDWHV 
XSUVXSGDWH)ORDW 6DODU\ 
XSUVXSGDWH5RZ 



Insertion et suppression
depuis Java

42

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

6WDWHPHQWVWPW FRQFUHDWH6WDWHPHQW
5HVXOW6HW7<3(B6&52//B6(16,7,9( 5HVXOW6HW&21&85B83'$7($%/( 
5HVXOW6HWXSUV VWPWH[HFXWH4XHU\ 6(/(&7 )520(PSOR\H 
XSUVPRYH7R,QVHUW5RZ  DXWUHVPpWKRGHVILUVW ODVWEHIRUH)LUVW DIWHU/DVW
DEVROXWH SUHYLRXV UHODWLYHPRYH7R&XUUHQW5RZ 
XSUVXSGDWH6WULQJ 1DPH-RVHSK 
XSUVXSGDWH,QW  
XSUVXSGDWH)ORDW 6DODU\I 
XSUVLQVHUW5RZ 
XSUVODVW 
XSUVGHOHWH5RZ 



43

Batch de plusieurs ordres

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

FRQVHW$XWR&RPPLW IDOVH 
6WDWHPHQWVWPW FRQFUHDWH6WDWHPHQW 
VWPWDGG%DWFK ,16(57,172 (PSOR\H 9$/8(6 
-DFTXHV
I  
VWPWDGG%DWFK ,16(57,172 (PSOR\H 9$/8(6 
3DXO
I  
VWPWDGG%DWFK ,16(57,172 (PSOR\H 9$/8(6 
0DULH
18//  
LQW >@ XSGDWH&RXQWV VWPWH[HFXWH%DWFK 
3UHSDUHG6WDWHPHQWSVWPW FRQSUHSDUHG6WDWHPHQW
,16(57,172 (PSOR\H 9$/8(6 " ""  
SVWPWVHW,QW  SVWPWVHW6WULQJ 
3LHUUH
SVWPWVHW)ORDW I 
SVWPWDGG%DWFK 
SVWPWVHW,QW  SVWPWVHW6WULQJ 
0DGHOHLQH
SVWPWVHW1XOO  
SVWPWDGG%DWFK 
LQW >@SXSGDWH&RXQWV SVWPWH[HFXWH%DWFK 
FRQFRPPLW 



44

Interface RowSet
Composants JavaBean
pour des sources de donnes tabulaires
tend ResultSet
Modle d vnement JavaBean

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

addRowSetListener, removeRowSetListener
peut tre connect un bean PieChart par exemple

Implmentations possibles
JDBCRowSet (JDBC/TCP)
CachedRowSet (RMI/IIOP) XWLOLVDEOHVSDUGHV3'$
WebRowSet (HTTP/XML)
YRLU>:KLWHHWDO@S



45

DataSource
Motivation
rendre les programmes indpendants des sources de donnes

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Datasource

une instance regroupe les informations de connexion (driver, dburl, user,


password)
puis est enregistre dans un service de rpertoire via JNDI
puis rcupre via JNDI
&RQWH[WFW[ QHZ ,QLWLDO&RQWH[W 
'DWD6RXUFHGV 'DWD6RXUFH FW[ORRNXS MGEF(PSOR\HH'% 
&RQQHFWLRQFQ[ GVJHW&RQQHFWLRQ 

FRQFORVH 

Sous-classes

XADataSource, ConnectionPoolDataSource



46

Pool de Connexions JDBC


Motivation
rutiliser les connexions JDBC entre plusieurs threads
(servlets, entity beans, ) au lieu de les crer puis de les
clore
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

impact important sur les performances d un serveur Servlet,

Classes

PooledConnection
reprsente une des connexions gres par le pool

ConnectionEventListener
permet de notifier les oprations effectues sur le PooledConnection

ConnectionPoolDataSource
permet de rcuprer un PooledConnection via JNDI
3RRO&RQQHFWLRQJHW3RROHG&RQQHFWLRQ



47

Autres interfaces
Array
reprsente un tableau SQL

2EMHFWJHW$UUD\ 5HVXOW6HWJHW5HVXOW6HW 

Struct
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

reprsente une structure SQL

Ref

2EMHFW>@JHW$WWULEXWHV 2EMHFW>@ JHW$WWULEXWHV 0DS P 6WULQJ JHW64/1DPH7\SH

reprsente une rfrence une structure SQL

SQLInput et SQLOutput

reprsentent un type user-defined sous la forme d un flot (entre-sortie)


LQWUHDG,QW YRLGZULWH,QW LQWDWWU 

SQLData

assure une correspondance personnalisable pour les types user-defined



Java-Aware Database
JHW2EMHFW HWVHW2EMHFW

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

SGBDOO et JDBMS

5HVXOW6HWUV VWPWH[HFXWH4XHU\ 6(/(&7 )520 (PSOR\H 


UVQH[W 
(PSOR\H H  (PSOR\H UVJHW2EMHFW  

(PSOR\HP QHZ (PSOR\H 0DWKLHX 
3UHSDUHG6WDWHPHQWSVWPW FRQSUHSDUHG6WDWHPHQW
,16(57,172(PSOR\H (PSOR\HBW 9$/8( "  
SVWPWVHW2EMHFW P 
SVWPWH[HFXWH8SGDWH 
5HPDUTXHOHE\WHFRGHQ HVWSDVVWRFNpLOIDXWXWLOLVHU
&ODVVIRU1DPH

49



50

Principe de Scurit de JDBC


respecte les principes Scurit de Java
JDK 1.0 et 1.1 / en changement avec JDK1.2

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Application / Thrusted Applets


EDVHVORFDOHV
VHUYHXU%'

Untrusted Applets / Untrusted JDBC Driver


FRQQH[LRQDXVHUYHXU%'
VL #GXVLWHGHFKDUJHPHQW



51

Utilisation : Application et Applets

Application
fichiers
locaux

fichiers
locaux

-'%&

r
cha
gem
ent

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

-'%&

Applet

Serveur BD

Serveur BD

Serveur
HTTPD



52

Utilisation : Servlets (i)


Applet

Servlet
-'%&

ent

Serveur BD

gem

Invocation
CGI

r
cha

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

fichiers
locaux

HTTPD

-HHYHV-LJVDZ



53

Utilisation : Servlets (ii)


Applet

Serveur BD

Servlet
-'%&

ent

HTTPD
VHUYOHW
GULYHU-'%&

gem

Invocation
CGI

r
cha

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

fichiers
locaux

HTTPD

-HHYHV-LJVDZ



54

JDBC et ANT
Tche ANT pour envoyer des ordres SQL
Via un driver JDBC

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Exemple avec McKoi

HFKR!4XHU\ WDEOHVHFKR!
VTO
GULYHU ^GULYHU`XUO ^XUO`XVHULG ^XVHULG`SDVVZRUG ^SDVVZRUG`
SULQW \HVFODVVSDWKUHI VTOGULYHUSDWK!
WUDQVDFWLRQ!>&'$7$>
6(/(&7 )520 $LU&UDIW
6(/(&7 )520)OLJKW
@@!WUDQVDFWLRQ!
WUDQVDFWLRQ!>&'$7$>
6(/(&7 )5207LFNHW
6(/(&7 )520 &XVWRPHU
@@!WUDQVDFWLRQ!VTO!



Le module DBI de PERL (i)

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

$FFqVDX[%'V SDUGHVVFULSWV3(5/
KWWSZZZKHUPHWLFDFRPWHFKQRORJLD'%,
XVHVWULFWXVH'%,
P\ GEK '%,!FRQQHFW
GEL2UDFOHRUFO

WRWR

SDVVHGHPRW

^5DLVH(UURU !$XWR&RPPLW !`
__GLH'DWDEDVHFRQQHFWLRQ QRWPDGH'%,HUUVWU
P\ #QDPHV   'X0D 
P\ VTO TT^6(/(&7QDPHVDODU\ )520 HPSOR\HHV :+(5( QDPH /,.("`
P\ VWK GEK!SUHSDUH VTO 
IRU #QDPHV ^
VWK!ELQGBSDUDP B'%,64/B9$5&+$5 VWK!H[HFXWH 
P\ QRPVDO VWK!ELQGBFROXPQV XQGHI?QRP?VDO 
ZKLOH VWK!IHWFK  ^SULQWQRPHVWSD\pVDO?Q`
`
VWK!ILQLVK GEK!GLVFRQQHFW 

55



Le module DBI de PERL (ii)

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

7UDQVDFWLRQV

XVHVWULFWXVH'%,
P\ GEK '%,!FRQQHFW
GEL2UDFOHRUFO

MHIIUH\

MHIIVSDVVZRUG

^5DLVH(UURU !$XWR&RPPLW !`
__GLH'DWDEDVHFRQQHFWLRQ QRWPDGH'%,HUUVWU
P\ #UHFRUGV 
>'XSRQW@>'XUDQG@>0DUWLQ@ 
P\ VTO TT^,16(57,172 HPSOR\HHV 9$/8(6 """ `
P\ VWK GEK!SUHSDUH VTO 
IRU #UHFRUGV ^
HYDO ^
VWK!ELQGBSDUDP #B!>@'%,64/B,17(*(5 
VWK!ELQGBSDUDP #B!>@'%,64/B9$5&+$5 
VWK!ELQGBSDUDP #B!>@'%,64/B,17(*(5 
VWK!H[HFXWH GEK!FRPPLW 
`
LI # ^ ZDUQ 'DWDEDVHHUURU'%,HUUVWU?QGEK!UROOEDFN `
`
VWK!ILQLVK GEK!GLVFRQQHFW 

56

Embedded SQL

Motivations
Oracle Pro*C
Informix ESQL
SQLJ



58

Motivation
Syntaxe plus concise que SQL/CLI
Analyse statique

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Contrle de la Syntaxe et du Typage


Typage curseur dpendant de la Mtabase

Prcompilation
Source
PL
+
ordres SQL
imbriqus

PrCompilateur
E-SQL dans PL

Source
PL
+
ordres SQL/CLI
imbriqus
ou ordres natifs

Compilateur
PL

Excutable

Base
MetaBase



59

Embedded SQL
Sections spciales

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

(;(&64/%(*,1(1''(&/$5(6(&7,21
pour les dclarations de variables 3GL partages avec SQL
(;(&64/6(/(&7,172
pour l excution d une requte SQL

Prcompilateurs
C

Informix ESQL/C
Oracle Pro*C

Java

SQLJ 2UDFOH7DQGHP,%06\EDVH
Java Relational Binding $UGHQW6RIWZDUH



60

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Exemple Pro*C
EXEC SQL INCLUDE SQLCA; /* manipulation des erreurs */
EXEC SQL BEGIN DECLARE SECTION;
char nom[21]; float salaire;
EXEC SQL END DECLARE SECTION;
scanf("%s",nom);
EXEC SQL EXECUTE
SELECT salary INTO :salaire
FROM Employe WHERE name = :nom;
END-EXEC;
if (sqlca.sqlcode != 0)  VTOHUUPFPHVVDJHG HUUHXUVTOHUUPOVDORQJXHXU 
printf(" Erreur dexecution.\n %.70s\n",
sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
else
printf ("%s gagne %d $\n", nom, salaire);



61

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Exemple de Curseur en Pro*C


EXEC SQL BEGIN DECLARE SECTION;
char nom[21]; float salaire;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL DECLARE c CURSOR FOR
SELECT name, salary FROM Employe WHERE salary > 10000;
EXEC SQL OPEN CURSOR c;
while(1) {
EXEC SQL FETCH c INTO :nom, :salaire;
if(NOT FOUND) break else printf ("%s gagne %d $\n", nom, salaire);
}
EXEC SQL CLOSE CURSOR c;



64

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Informix ESQL/C
EXEC SQL DECLARE cursemp CURSOR FOR
SELECT name, salary INTO QRPVDOQXOOBIODJ
FROMEmploye FROM items
FOR READ ONLY;
EXEC SQL OPEN cursemp;
while(SQLCODE == 0) {
EXEC SQL FETCH cursemp;
if(SQLCODE == 0)
if (null_flag < 0)printf("%d gagne rien\n", nom)
else
printf("%s gagne %d$\n", nom, sal);
}
EXEC SQL CLOSE cursemp;



65

SQLJ - SQL Java


SURSRVpSDU2UDFOH,%06\EDVH7DQGHPjO ,62$16,

Embedded-SQL dans Java

vers un source Java avec des appels JDBC

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Exemple

YRLG SULQWBVDODU\ 6WULQJQRP WKURZV 64/([FHSWLRQ^


LQW VDO
VTOFRQWH[WFQ['5+

VTO ^6(/(&7VDODU\ ,172VDO)520(PSOR\H :+(5(QRP QDPH `

6\VWHPRXWSULQWOQ QRPHVWSD\pVDO 
VTO >FQ[5(&@^'(/(7()520(PSOR\H `VXUODFRQQH[LRQFQ[5(&



66

SQLJ - Itrateurs

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

1RWLRQGHFXUVHXU
VTO SXEOLF LWHUDWRU,WHU(PS 6WULQJ LQW GpFODUDWLRQG XQHFODVVHG LWpUDWHXU
,WHU(PSLWHUGpFODUDWLRQG XQREMHW LWpUDWHXU
6WULQJQRPLQW VDOLQWF 
VTOLWHU ^6(/(&7QDPHVDODU\ )520(PSOR\H `
ZKLOH WUXH ^
VTO ^)(7&+LWHU ,172QRPVDO`
LI LWHUHQG)HWFK EUHDN
LI F 6\VWHPRXWSULQWOQ QRPHVWSD\pVDO 
`
LWHUILUVW VHUHSRVLWLRQQHDXSUHPLHUUpVXOWDW
ZKLOH LWHUQH[W  ^VHSRVLWLRQQHVXUOHVUpVXOWDWVHQSRVLWLRQLPSDLUH
6\VWHPRXWSULQWOQ LWHUQDPH HVWSD\pLWHUVDODU\  
`



67

SQLJ - Autres
Modification au niveau de l itrateur

,WHU(PSLWHUGpFODUDWLRQG XQREMHW LWpUDWHXU


VTOLWHU ^6(/(&7 QDPH VDODU\ )520 (PSOR\H `
VTO ^83'$7( (PSOR\H 6(7 VDODU\ VDODU\ :+(5(&855(172)LWHU `

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Valeurs Nulles

MDYDVTO'DWHG QXOO LQW V QXOO


VTO ^,16(57,172 (PSOR\H QDPH VDODU\ ELUWKGD\KREE\
9$/8(6
'XSRQG
VG18// `

Blocs et Atomicit

YRLG 7UDQVIHUW LQW [LQW \LQW P ^


VTO ^$720,&%(*,1
83'$7(&RPSWH6(7VROGH VROGHP:+(5(QXPFSW [
83'$7(&RPSWH6(7VROGH VROGH P:+(5( QXPFSW \
,16(57,1727UDQVIHUWV FSWFUHGLWFSWGHELWPRQWDQW 9$/8(6 [\P 
(1'``



68

SQLJ - Interoprabilit avec JDBC

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Parcours d une requte SQLJ partir d un Result6HW


VTOMUXQWLPH5HVXOW6HW,WHUDWRULWHU
VTOLWHU ^6(/(&7 QDPH VDODU\ )520 (PSOR\H `
MDYDVTO5HVXOW6HWUV LWHUJHW5HVXOW6HW 
ZKLOH UVQH[W ^
6WULQJV UVJHW6WULQJ   IORDW I UVJHW)ORDW VDODU\ 
6\VWHPRXWSULQWOQ VJDJQHI 
`UVFORVH 

Construction d un itrateur partir d un ResultSet

,WHU(PSLWHU
5HVXOW6HWUV VWPWH[HFXWH4XHU\ 6(/(&7QDPH VDODU\ )520(PSOR\H 
VTOLWHU UV 
ZKLOH LWHUQH[W ^
6\VWHPRXWSULQWOQ LWHUQDPH HVWSD\pLWHUVDODU\  
`



69

JavaBlend
Mapping transparent
d objets Java avec les lignes d une base
relationnelle
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Utilise l ODL de l ODMG pour la description



Extra JDBC

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

p6spy : espion pour surveiller le trafic JDBC


ObjectWeb XAPool : pool de connexions pour
JDBC

70

SQL Procdural

Motivations
Architecture
SQL3 / PSM
Informix SPL
Oracle PL/SQL
Un nouveau venu : Java



72

Motivations
pour un SQL procdural

Inconvnients
Dynamic SQL et Middleware SQL (ODBC, JDBC, ...)
requte vrifie l excution (runtime)
typage faible variable hte et curseur
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Embedded SQL in 3GL


prcompilation

Dans les deux cas


impedance mismatch
code procdural du cot client (cot rseau)
Begin
For i=1 to 4
Select ...
End

Client

SQL
SQL
SQL
SQL

Serveur
SQL

BDR



73

Architecture Client-Serveur
Dynamic SQL et Embedded SQL
Client

SQL
SQL
SQL
SQL

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Procdure anonyme
Client

PL/SQL

Procdure stocke
Client

RPC

Serveur
SQL

BDR

Moteur Serveur
PL/SQL SQL

BDR

Moteur Serveur
PL/SQL SQL

BDR

Procdure
Stocke
PL/SQL



74

Architecture Client-Serveur
Triggers

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

SQL
Update,
Delete,
Insert

Client

Moteur Serveur
PL/SQL SQL
Action
PL/SQL
d un
Trigger

BDR



75

Standard et Langages
Le standard
SQL3 / PSM

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Les diteurs

Informix SPL
Oracle PL/SQL

Remarque

Java est de plus en plus utilis


pour les Java Stored Procedures
JVM sur le serveur BD



76

Utilisation dans Oracle


Procdures anonymes
Oracle SQL*PLUS, SQL*DBA

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Procdures Stockes
Actions des Dclencheur Triggers
Oracle SQL*MENU, SQL*FORMS



77

Bloc (Procdure) anonyme


envoy par le client au serveur

Syntaxe

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

DECLARE
BEGIN
EXCEPTION
END;
.
Run;

dclarations des variables locales


suite dinstructions PL/SQL
ou de blocs anonymes
suite dinstructions PL/SQL
ou de blocs anonymes

-- optionel

-- optionel

-- provoque lexcution de la procdure anonyme



78

Typage des Variables


Type de Donnes SQL

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

CHAR, VARCHAR2, NUMBER, DATE, BOOLEAN, LONG, RAW,


ROWID

Constructeur de type complexe


RECORD, TABLE, TABLE of RECORDS

ADT Abstract Data Type


type objet

Dsignation du type dune colonne dun table


QRPGHWDEOH!QRPGHFRORQQH!7<3(



79

Instructions
Affectation
Instructions SQL
Requte
SELECT, INSERT, UPDATE, DELETE

Transaction
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

COMMIT, ROLLBACK, SAVEPOINT

Curseur
DECLARE, OPEN, FETCH, CLOSE, WHERE CURRENT OF

Structures de Contrle
imbrication illimite

IF...THEN...ELSIF...END IF
boucles FOR, WHILE, LOOP et EXIT, GOTO

Exceptions
Exceptions internes au SGBD ou dfinies par l utilisateur
Plusieurs niveaux d exception



80

Instructions
Affectation

YDULDEOH! := YDULDEOHRXH[SUHVVLRQ!;
SELECT YDULDEOH! INTO YDULDEOH! VXLWHGHODFODXVH )520:+(5(! ;

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Test

IF FRQGLWLRQ! THEN LQVWUXFWLRQV! END IF;


IF FRQGLWLRQ! THEN LQVWUXFWLRQV! ELSE LQVWUXFWLRQV! END IF;
IF FRQGLWLRQ! THEN LQVWUXFWLRQV! ELSE LQVWUXFWLRQV!
ELSIF FRQGLWLRQ! THEN LQVWUXFWLRQV! END IF;

Boucles

LOOP LQVWUXFWLRQV! EXIT WHEN FRQGLWLRQGHVRUWLH!


LQVWUXFWLRQV! END LOOP;
WHILE FRQGLWLRQ! LOOP LQVWUXFWLRQV! END LOOP;

FOR YDULDEOH! IN YDOHXU! YDOHXU! LOOP LQVWUXFWLRQV! END LOOP;



81

Affection partir dune requte


1 seule ligne retourne sinon erreur

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

SELECT INTO

DECLARE
masseSalairialePlus10000 Employe.salary%TYPE;
BEGIN
SELECT
SUM(salary)
INTO
masseSalairialePlus10000
FROM
Employe
WHERE
salary > 10000;
END;

RETURNING

DECLARE nomEmploye.name%TYPE, nouveausal Employe.salary%TYPE


BEGIN
UPDATE Employe SET salary = salary * 1.1 WHERE numemp = 100
RETURNINGname, salary INTO nom, nouveausal;
END;



82

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Exceptions (i)
declare
s Employe.salary%TYPE;
--variable locale
EHJLQ
EHJLQ
select salary into s from Employe where numemp = num;
H[FHSWLRQ
ZKHQ QRBGDWDBIRXQG
EHJLQ
s := -1; notifieErreur (num); -- Appel d une autre procdure
HQG
HQG
H[FHSWLRQ
ZKHQ QRBGDWDBIRXQG
EHJLQ
QRWLILH(UUHXU QXP  -DPDLVDWWHLQW
HQG
ZKHQRWKHUVWKHQQXOO
HQG



83

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Exceptions (ii)
declare
HB'HSDVVHPHQW
(;&(37,21 GpFODUDWLRQG XQHH[FHSWLRQXWLOLVDWHXU
s
Employe.salary%TYPE;
EHJLQ
begin
select sum(salary) into s from Employe;
if s > 1000000 then
UDLVH HB'HSDVVHPHQW;
end if;
exception
ZKHQ HB'HSDVVHPHQW
begin
RAISE_APPLICATION_ERROR(-20001, '
La masse salariale a explos ! );
end;
when no_data_found
begin
notifieErreur2 (num); -- Jamais atteint
end;
when others then null;
end;



84

Curseurs
Dclaration

CURSOR QRPFXU! IS UHTXrWH6(/(&7!;

Usage

Ouverture
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

OPEN QRPFXU!;

Parcours dans un boucle


test d arrt
EXIT WHEN QRPFXU!%NOTFOUND;
WHILE QRPFXU!%FOUND LOOP ...
rcupration des valeurs dans des variables
FETCH QRPFXU! INTO OLVWHGHYDULDEOHV! ;

Fermeture

CLOSE QRPFXU!;



85

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Exemple de Curseur
CREATE OR REPLACE PROCEDURE augmentationSalaire(
seuil
INEmploye.salary%TYPE,
augmentation
IN NUMBER(2)
) AS
sal Employe.salary%TYPE;
num Employe.numemp%TYPE;
&85625F,66(/(&7 VDODU\ QXPHPS )520 (PSOR\H;
BEGIN
23(1F;
)(7&+F,172VDO QXP;
 DWWHQWLRQjORUGUHW\SHVFRPSDWLEOHV
WHILE F)281' LOOP
IF sal IS NOT NULL AND sal < seuil THEN
UDPATE Employe SET salary = salary*(augmentation + 100.0)/100
WHERE numemp = num;
END IF;
)(7&+F,172VDO QXP;
END LOOP;
&/26(F
END;



86

Procdures et Fonctions
Plusieurs Types

%ORF SURFpGXUH DQRQ\PH

HQYR\pSDUOHFOLHQWDXVHUYHXU

Procdure stocke, Fonction stocke


stockes sur le serveur
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Procdure membre, Fonction membre


mthodes membres des types objets

Procdure externe
crit en LG3, utilise l API d Oracle
OCI : 2UDFOH&DOO,QWHUIDFH

peut tre invoqu depuis PL/SQL

Fonctionnalits gnrales

Rcursion illimite
Surcharge des paramtres
Passage des paramtres avec des modes IN, OUT, INOUT



87

Procdures Stockes

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Dclaration

CREATE OR REPLACE PROCEDURE QRPSURF! ( OLVWDUJ! )


dclarations des variables locales (optionel)
BEGIN
suite dinstructions PL/SQL
EXCEPTIONS
suite dinstructions PL/SQL
END;
.
Run;
-- dclaration de la procdure stocke

Liste des Arguments

QRPDUJ PRGHW\SH
PRGH : IN, OUT ou INOUT
W\SH : de base (SQL92), NUMBER, ADT (SQL3)
dsignation du type d une colonne d un table
WDEOH!FRORQQH!7<3(

AS



88

Procdures Stockes

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Exemple

CREATE OR REPLACE PROCEDURE nouvelEmploye(


n INEmploye.name%TYPE, s INEmploye.salary%TYPE
) AS BEGIN
INSERT INTOEmploye VALUE ( 123, n, s, NULL);
END;
.
RUN;

Invocation depuis un bloc anonyme


BEGIN
nouvelEmploye(Martin, 10000);
nouvelEmploye(Dupont, 20000);
END;
.
RUN;



89

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Fonctions
create or replace function get_sal (numin Employe.numemp%TYPE)
return Employe.salary%TYPE is
s Employe.salary%TYPE;
--variable locale
begin
begin
select salary into s from Employe where numemp = num;
exception
when no_data_found
begin
s := -1; notifierErreur (num); -- Appel d une autre procdure
end;
when others then null;
end; -- bloc imbriqu
return s;
end; -- function



90

Informix SPL
SPL (Stored Procedure Language)

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Dfinition de Procdures et de Fonctions Stockes


CREATE PROCEDURE raise_prices( per_cent INT)
...
END PROCEDURE
DOCUMENT "USAGE: EXECUTE PROCEDURE raise_prices (xxx)",
"xxx = percentage from1 - 100";
CREATE FUNCTION find_group( id INT )
RETURNING INT, REAL;
...
END FUNCTION;
DROP PROCEDURE raise_prices;



91

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Informix SPL - Imbrication de bloc


CREATE PROCEDURE scope()
DEFINE x,y,z INT;
LET x = 5;
LET y = 10;
LET z = x + y; --z is 15
BEGIN
DEFINE x, q INT;
DEFINE z CHAR(5);
LET x = 100;
LET q = x + y; -- q = 110
LET z = silly; -- z receives a character value
END
LET y = x; -- y is now5
LET x = z; -- z is now15, not silly
END PROCEDURE;



92

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Informix SPL - Curseur


CREATE_PROCEDURE increase_by_pct( pct INTEGER )
DEFINE s INTEGER;
FOREACH sal_cursor FOR
SELECT salary INTO s FROMemployee
WHERE salary > 35000
LET s = s + s * ( pct/100 );
UPDATE employee SET salary = s
WHERE CURRENT OF sal_cursor;
END FOREACH
END PROCEDURE;



93

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Informix SPL - Exception


BEGIN
ON EXCEPTION IN (1)
END EXCEPTION WITH RESUME -- do nothing significant (cont)
BEGIN
FOR i IN (1 TO 1000)
FOREACH select ..INTOaa FROM t
IF aa < 0 THEN
RAISE EXCEPTION 1 ; -- emergency exit
END IF
END FOREACH
END FOR
RETURN 1;
END
--do something; -- emergency exit to this statement.
TRACE Negative value returned;
RETURN -10;
END



96

Java, Persistance et Bases de Donnes


Rendre persistant des objets Java
35% du travail du dveloppeur passe dans le mapping Objet/JDBC

Plusieurs solutions de stockage


Srialisation + Fichier
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

/ ne permet pas le partage et la recherche, n est pas incrmental

JDBC
API bas-niveau

/ impedance mismatch

SQLJ
Embedded SQL in Java

/ impedance mismatch

JavaBlend
JDO



97

JavaBlend
OML Java de l ODMG2.0 (www.odmg.org)
classes additionnelles

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

PersistentRoot et OID
Dcollection , ...

Transparence au SQL
Surcouche JDBC



98

Java Data Objects (JDO)


Permet de rendre persistants des instances
de nimporte quelles classes
Persistance transparente
Accs direct aux membres
Pas des mthodes set/get (accesseur/mutateur)
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Drferenciation par .

Instances persistante / transiente

Architecture de base
PersistenceManager

Gre les accs, la sauvegarde, les transactions et les recherches entre les
applications et les Data Stores

Transaction
Query
Recherche sur critre.

classes PersistenceCapable
Interface que doit implmenter une classe dont des instances peuvent tre
persistentes



99

JDO - Query

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Exemple
class Employee {
String name;
Integer salary;
Employee manager;
}
...
Collection extent = persistMngr.getExtent(Class.forName("Employee"), false);
Query q = persistMngr.newQuery (
Class.forName ("Employee"), // class
extent,
// candidates
"salary > 50000"
// filter
);
Collection resultSet = q.execute();



100

Java cot SGBD


Java Stored Procedure/Function (Oracle)
Procdures/Fonctions stockes crites en Java (au lieu de
PL/SQL) et utilisant JDBC ou SQLJ

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Java Triggers (Oracle)

Actions des triggers crites en Java (au lieu de PL/SQL) et


utilisant JDBC ou SQLJ



101

Bibliographie - Autre

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

PL/SQL
Scott Urman , Oracle8 PL/SQL Programming , ed Osborne-McGrawHill, Oracle Press Series, ISBN 0-07-882305-6.
Steven Feuerstein, Oracle PL/SQL Programming ,2nd Edition, ed
O'
Reilly. ISBN 1-56592-335-9.
Steven Feuerstein, Advanced Oracle PL/SQL Programming with
Packages , ed O'
Reilly, ISBN 1-56592-238-7.
http://technet.oracle.com

ADO

La rfrence du programmeur ADO 2.0 (mi juin 99), Ed Eyrolles



102

Procdures stockes en .NET

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Motivations

Procdures et fonctions stockes


Actions des Triggers
ADT et Index sur ADT
Fonctions complexes d agrgat

Langage CLR : C#, Managed C++, J#, VB,


Principes
Chargement des assemblies
Cration des procdures



103

Chargement des assemblies

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

CREATE ASSEMBLY <assembly id>


FROM <path>
WITH PERMISSION_SET=[SAFE|EXTERNAL_ACCESS|UNSAFE]
CREATE ASSEMBLY Customer
FROM '
C:\build\cust\customer.dll'

2 tables systmes: sys.assemblies et sys.assembly_files



104

Cration de procdures

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

CREATE PROCEDURE <procname>


AS EXTERNAL NAME <assembly is>::<type name>::<method name>
class Salary {
public static int compute(int sal) { }
}
CREATE PROCEDURE ComputeSalary
@sal int
AS EXTERNAL NAME Customer::Salary::compute
DECLARE @s int
SET @s=10000
EXEC ComputeSalary 100000 @s OUTPUT
SELECT @s



105

Bibliographie
JDBC
S. White, M. Fisher, R. Cattell, G. Hamilton, M. Hapner, "JDBC API
Tutorial and Reference", Ed Addison-Wesley, ISBN 0-201-63459-7

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

trs complet (le plus complet)

George Reese, Database Programming with JDBC and Java with


Packages , 1st Edition June 1997, ed O'
Reilly, ISBN. 1-56592-270-0
(ISBN 2-84177-042-7 en franais)
un peu incomplet

Robert Orfali, Dan Harkey, Client/Server Programming with Java and


Corba , 2me dition, 1998, Ed Wiley, ISBN 0-471-24578-X. Chapitres
23 26.
mise en uvre de JDBC en architecture multi-tiers
benchmark TPC/AB avec JDBC

Tutorial JDBC de http://java.sun.com



106

Bibliographie
SQLJ

'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

Nirva Morisseau-Leroy, Martin Solomon, Gerald


Momplaisir, Oracle9i SQLJ Programming, Oracle Press
2001, ISBN: 0072190930



107

Bibliographie
Revues
DBMS Magazine www.dbmsmag.com
DB2 Magazine www.ibm.com
Oracle On-line Magazine www.oramag.com
'LGLHU'RQVH]3URJUDPPDWLRQ3URFpGXUDOHHW64/

y sont publis des tips sur PL/SQL

Vous aimerez peut-être aussi