Vous êtes sur la page 1sur 116

Create Database Oracle 10g - John COLIBRI.

rsum : cration pas pas d'un base de donnes ORACLE


mots cl : Oracle 10g - create database - SID - connect nolog -
startup - Sql/Plus - create database script
logiciel utilis : Windows XP personnel, 32 bits
matriel utilis : Pentium 1.400 Mhz, 256 Meg memoire, 140
G disque
champ d'application : Windows
niveau : dveloppeur base de donnes
plan :
o Introduction
o Cration de la Base
o Automatisation

1 - Introduction

Nous allons dtailler ici comment crer une base de donne Oracle 10g.

La cration d'une base Oracle est traditionnellement reconnue comme une


opration trs complexe. En effet la base peu tre organise de multiples
faons, et de nombreux paramtres fournis lors de la cration permettent de
spcifier la configuration. Une parfait matrise de la cration ncessite donc
avant tout une bonne comprhension de l'architecture du serveur Oracle.

N'ayant pas pour but de reproduire les 700 pages du manuel d'architecture
Oracle, nous allons utiliser une autre approche plus directe, en dcrivant les
tapes prcises que nous avons utilises pour crer notre base.

Rappelons que nous utilisons la configuration suivante:

Windows XP personnel, 32 bits

Aprs l'installation du Serveur Oracle, les paramtres de notre Serveur


Oracle sont les suivants:

le mot de pass pour SYSMAN, SYS et SYSTEM est the_pass

Nous allons crer une base de donne:

son identificateur sera the_sid


elle sera place dans le rpertoire c:\oracle\the_path

Pour crer la base, nous allons

crer une variable d'environnement ORACLE_SID


crer un service
crer le fichier de paramtres
dmarrer l'instance et la base
crer la base
crer les tables systme
crer une TableSpace
vrifier la cration d'une table

1 - Cration de la Base

1.1 - Cration d'une variable DOS ORACLE_SID

Nous allons utiliser une instance Oracle, qui sera identifie par son SID
(System IDentifier). Ce SID devra tre reconnu au niveau de la ligne de
commande DOS, et pour cela nous devons crer une variable
d'environnement DOS contenant ce SID. La cration de cette variable est
effectue en utilisant la commande DOS SET.

Par consquent

lancez CMD.EXE
la ligne de commande attend vos instructions

crez le SID the_sid en tapant


SET ORACLE_SID=the_sid Entre
DOS cr la variable:

Nous pouvons vrifier que cette variable a bien t cre en tapant SET:

tapez

SET Entre
DOS prsente toutes les variables d'environnement, parmi lesquelles the_sid:

1.2 - Cration d'un Service

Nous devons prsent crer un Service Windows qui grera notre instance.
Nous crons ce service en utilisant ORADIM.EXE.

Donc:

tapez la commande

oradim -new -sid the_sid -intpwd mypass -startmode manual Entre


Oracle cre le service:
Nous vrifions que le service a bien t cr:

tapez:

services.msc Entre

(ou utilisez "dmarrer | paramtres | panneau de configuration | outils


d'administration | services" )
Windows affiche les services utiliss par notre systme, dont
OracleServicethe_sid:

De plus, Oracle a cr un fichier de mots de passe pour ce service (dans


"OracleHome"\database):
1.3 - Crer le fichier de paramtres

L'instruction de cration de la base utilisera un fichier de paramtres. Ce


fichier est un fichier binaire, appel SPFILE. Ce fichier binaire est gnr
partir d'un fichier ASCII INIT.ORA que nous devons crer.

L'installation d'Oracle place un fichier INIT.ORA type


"OracleHome"\admin:
Ce fichier de 8K comporte de nombreux commentaires:

# Use the following table to approximate the SGA size


needed for the
# three scenarious provided in this file:
#
# -------Installation/Database
Size------
# SMALL MEDIUM
LARGE
# Block 2K 4500K 6800K
17000K
# Size 4K 5500K 8800K
21000K

et pour les principaux paramtres plusieurs choix (un choix par dfaut et, en
commentaire, d'autres possibilits)

db_files = 80 # INITIAL
# db_files = 80 # SMALL
# db_files = 400 # MEDIUM
# db_files = 1500 # LARGE

En utilisant les valeurs par dfaut du fichier type, nous avons eu quelques
erreurs. Aprs quelques ttonnements, nous avons finalement russi en
utilisant un fichier minimal, que nous allons utiliser.

Donc:
crez le rpertoire c:\Oracle\the_path avec les sous-rpertoires pour placer le
fichier d'initialisation, les scripts, les traces, les cho DOS:

dmarrez NotePad, tapez le texte du fichier de paramtres:

db_name = the_base

db_block_size = 2048

# trace (log) files


background_dump_dest = C:\ORACLE\the_path\the_trace
user_dump_dest = C:\ORACLE\the_path\the_trace

control_files = C:\ORACLE\the_path\control01_the_sid.ora

# add if undo in create database


undo_management = auto
Sauvegardez ce fichier dans:

c:\Oracle\the_path\the_init\init_the_sid.ora

1.4 - Dmarer l'instance

L'instance va tre dmare en utilisant Sql/Plus. Comme aucune instance


n'existe, nous devons utiliser des paramtres spciaux pour que Sql/Plus
accepte nos commandes:

il faut lancer Sql/Plus avec l'option /nolog (nolog= NO LOGin=


lancement sans fournir User/password)
une fois sous Sql/Plus
o nous nous connectons en tant que SYS/mon_mot_de_passe AS
SYSDBA
o nous excutons CREATE DATABASE avec les paramtres de
cration
o nous crons les fichiers systme, puis ventuellement nos
tables

Le lancement de Sql/Plus doit tre manuel. Mais une fois que nous sommes
dans Sql/Plus, dont l'diteur est peine plus malin que celui de DOS, le plus
efficace est d'utiliser des scripts:

nous tapons les commandes excuter dans un fichier ASCII


construit avec l'diteur de votre choix (Delphi pour nous, mais
Notepad ou autre fonctionne aussi) et sauvegardons le texte dans un
fichier ayant n'importe quel nom (par exemple the_script.txt)
dans Sql/Plus nous invoquons le script en tapant:

@? \the_script.txt Entre

Sous Sql/Plus

o @ est une abrviation de START (= lancement de script)


o ? est une abrviation de "OracleHome"
(c:\oracle\product\10.1.0\Db_1\ dans notre cas)

Par consquent:
lancez votre diteur prfr (NotePad, par exemple) et tapez le script suivant:

Set Echo Off


Spool 'c:\oracle\the_path\the_echo\echo_create_database.txt'

CREATE DATABASE the_base


CHARACTER SET WE8ISO8859P1
LogFile
group 1 'c:\oracle\the_path\redo1.log' size 10M reuse,
group 2 'c:\oracle\the_path\redo2.log' Size 10M reuse
DataFile 'c:\oracle\the_path\system.dbf' Size 50M
autoextend on
next 10M maxsize unlimited
extent management local
sysaux datafile 'c:\oracle\the_path\sysaux.dbf' Size 10M
autoextend on
next 10M
maxsize unlimited
undo tablespace the_undo
datafile 'c:\oracle\the_path\the_undo.dbf'
Size 10M
default temporary tablespace the_temp
tempfile 'c:\oracle\the_path\the_temp.dbf'
Size 10M
;

Shutdown
Spool Off
sauvegardez ce texte sous:

c:\Oracle\the_path\the_script\create_database.txt
retournez dans la ligne de commande DOS et lancez Sql/Plus en tapant:

sqlplus /nolog Entre


Sql/Plus affiche son invite:

connectez-vous en tant que SYS

connect sys/ the_pass as sysdba


Sql/Plus effectue la connexion:

dmarrez l'instance en tapant:

Startup Nomount pFile= c:\oracle\the_path\the_init\init_the_sid.ora


Sql/Plus dmarre l'instance:

lancez le script de cration en tapant


@ c:\oracle\the_path\the_script\create_database.txt Entre
Sql/Plus cre la base

Et le dossier contient les fichiers suivants:

Notez que
l'utilisation d'un script pour la connexion, le chargement et CREATE
TABLE n'est pas obligatoire. Vous pouvez taper les commandes la
main
en cas de problme, le fichier de log cr par SPOOL permet de
vrifier calmement ce qui s'est pass. De faon similaire, les traces
(fichiers .TRC) qui seront dposs dans THE_TRACE peut fournir
les codes des erreurs
il aurait t possible de placer CONNECT, STARTUP et CREATE
TABLE dans le mme script
nous avons ferm la base aprs la cration, mais il serait possible de
placer dans le mme script les tapes que nous allons prsenter
maintenant

1.5 - Cration des tables systme

La base cre est vide, et il faut excuter des scripts qui installent des tables
et programmes systmes dans la base:

catalog.sql cre le dictionnaire de donnes


catproc.sql cr les structures pour PL/SQL.

Catalog.sql fait 820 K (sic). Il vaut donc mieux lancer ce script en mode
ECHO OFF. L'excution dure une bonne vingtaine de minutes.

Donc:

lancez Notepad et tapez le script suivant:

Set Echo Off


Spool'c:\oracle\the_path\the_echo\echo_catalogs.txt'

connect sys/ the_pass as sysdba

Startup
pFile=c:\oracle\the_path\the_init\init_the_sid.ora

@? \rdbms\admin\catalog.sql
@? \rdbms\admin\catproc.sql

Shutdown
Spool Off
sauvegardez ce texte sous:
c:\Oracle\the_path\the_script\create_catalogs.txt
retournez dans Sql/Plus et lancez ce script:

@ c:\oracle\the_path\the_script\create_catalogs.txt Entre
Sql/Plus lance ces deux scripts (20 minutes)

1.6 - Cration de TableSpace

Nous crons prsent un fichier pour nos donnes (TableSpace):


lancez Notepad et tapez le script suivant:

Set Echo Off


Spool 'c:\oracle\the_path\the_echo\echo_tablespace.txt'

connect sys/ the_pass as sysdba

Startup pFile= c:\oracle\the_path\the_init\init_the_sid.ora

grant connect to system identified by the_manager;

connect system/ the_manager

create tablespace the_tables


datafile 'c:\oracle\the_path\the_tables.dbf'
size 10m extent management local uniform size 128k;

-- si nous souhaitons bloquer Sql Plus


-- @?\sqlplus\admin\pupbld

Shutdown
Spool Off
sauvegardez ce texte sous:

c:\Oracle\the_path\the_script\create_tablespace.txt
retournez dans Sql/Plus et lancez ce script:

@ c:\oracle\the_path\the_script\create_tablespace.txt Entre
Sql/Plus cre le fichier de donnes
1.7 - Creation de Table de Dmonstration

A titre de vrification, nous allons crer une table utilisateur, et vrifier son
fonctionnement. Pour cela, nous utilisons le script demobld qu'Oracle a
fourni pour crer une table DEPT et EMP
lancez Notepad et tapez le script suivant:

Set Echo Off


Spool 'c:\oracle\the_path\the_echo\echo_demo_table.txt'

connect sys/ the_pass as sysdba

grant connect, resource to my_user


identified by my_pass;
alter user my_user
default tablespace the_tables;

connect my_user/my_pass
@? \ODP.NET\samples\DataSet\RelationalData\Setup\demobld

select * from dept;

Spool Off
sauvegardez ce texte sous:

c:\Oracle\the_path\the_script\create_demo_tables.txt
retournez dans Sql/Plus et lancez ce script:

@ c:\oracle\the_path\the_script\create_demo_tables.txt Entre
Sql/Plus cre le fichier de donnes

2 - Automatisation
Au cours de la cration de la base, nous avons rencontr quelques
problmes. Mentionnons les rapidement:

la cration de la variable d'environnement ORACLE_SID ne semble


pas obligatoire. En certaines circonstances, le chargement de la base a
provoqu des erreurs TNS-12580. La suppression de SET a alors
supprim cette erreur
aprs des tentatives infructueuses, il se peut que le serveur considre
qu'une base est ouverte ou monte (ORA-01081). L'excution brutale
de SHUTDOWN ABORT rsoud le problme.

De faon gnrale, la ncessit de recommencer plusieurs essais nous a


pouss utiliser:

un fichier ASCII contenant les commandes taper dans CMD.EXE.


Au lieu de taper les lignes, il suffit alors de couper la commande
dsire de ce fichier ASCII et les coller (clic droit souris | coller)
aprs le ">" de CMD.EXE
pour les commandes Sql/Plus complexes (CREATE TABLE), nous
avons plac cette suite de commandes dans un fichier de script, et le
script a t lanc
pour les traitements impliquant plusieurs commandes DOS
(suppression de service et effacement de fichier de mot de passe),
nous avons utilis des fichiers .BAT

Nous avons plac ces textes ASCII dans un fichier .ZIP que vous pouvez
tlcharger:

.BAT, clipboard, scripts : .ZIP contenant les commandes, les .BAT et


les scripts .TXT (3 K)

Nous proposons aussi:

Installation Oracle : comment installer le Serveur et le Client


Oracle Tutorial : comment crer des application Client (comptabilit,
facturation, pages Web, gestion de production etc)
Formations Oracle : ralisation d'applications Oracle (cration de
table, d'index, criture / lecture / modification, transactions, tats), en
tenant compte des spcificits Oracle (types de donnes, squences,
procdures catalogues, transactions).
nous avons aussi compil une liste de liens Oracle destine tout
particulirement aux dvelopeurs.
Installation ORACLE 10g - John COLIBRI.
rsum : prsentation dtaille de l'Installation du Serveur et
du Client d'une base de donnes Oracle
mots cl : Oracle - Client - Serveur - Sql-Plus, TnsNames,
TnsPing
logiciel utilis : Windows XP personnel
matriel utilis : Pentium 1.400Mhz, 256 M de mmoire, 140
Giga disque dur
champ d'application : Windows NT, XP, 2000
niveau : dveloppeur Bases de Donnes
plan :
o Introduction
o Tlchargement Oracle
o Architecture Client Serveur
o Installation du Serveur Oracle
o Installation du Client Oracle
o La programmation d'applications Oracle

1 - Introduction
Nous allons prsenter ici les tapes qui installeront le Serveur et
le Client Oracle 10G.

Nous insisterons sur trois points:

Bien que Oracle 10g soit bien plus simple que les autres versions
d'Oracle que nous avons utilis (notamment Oracle 7), le processus
d'installation reste une preuve un peu dlicate cause des nombreux
mots de passe censs protger la base. Il est donc important de
sauvegarder toutes les informations qui seront fournies l'occasion de
l'installation. Nous utilisons pour cela des sauvegarde d'cran et le
couper/coller/sauvegarde des fichiers texte. Ces informations se
retrouvent:
o dans la documentation
o et dans quelques fichier .TXT au milieu des 20.985 fichiers
nichs dans les 2.752 dossiers crs ici ou l pendant
l'installation
o dans cette prsentation
Toutefois, si vous utilisez une autre version d'Oracle, elles peuvent
tre lgrement diffrentes

les paramtres qu'il faut fournir et mmoriser


les tests permettant de vrifier le succs de chaque tape

Avant de commencer

mon PC utilise Windows XP personnel (pas professionnel)


mon explorateur est Internet Explorer 6.0
le nom du PC est "pol-1400" et son adresse IP est 192.168.0.2

Pour le Client, nous utilisons

un Notebook, Windows XP personnel (pas professionnel)


son adresse IP est 192.168.0.3

Nous allons aborder

l'architecture gnrale
le tlchargement du serveur et du client
l'installation du Serveur
l'installation du Client
la programmation Oracle

2 - Architecture Client Serveur


Cette section prsente succintement l'organisation Client Serveur Oracle,
pour mieux comprendre ce qui va tre install.

Oracle stocke les donnes dans des fichiers sur le Serveur


le Serveur comporte aussi un programme qui sait lire et crire les
donnes, et communiquer avec les Clients
les Clients sont situs sur des machines, relies au Serveur par un
rseau
chaque Client comporte un programme qui sait communiquer avec
le Serveur
Schmatiquement nous avons

Nous devrons donc:

sur le Serveur
o installer le programme
o crer la base de donnes (les fichiers)
sur le Client
o installer le programme client Oracle
o crer le fichier de paramtres
o par la suite (non prsent), crer des applications client

3 - Tlchargement Oracle
Nous avons tlcharg les deux parties d'Oracle 10g du site Oracle:
En cliquant le lien "10g_win32_db.zip" nous avons sauvegard les 600
Megs dans c:\download\oracle\

Le tlchargement nous a pris prs de 3 heures (ADSL 512 K).

Nous avons aussi tlcharg le Client dont le lien est un peu plus bas:
Tlchargement en une petite heure.

4 - Installation du Serveur Oracle


4.1 - Dcompression

Le fichier 10g_win32_db.zip a t dzipp dans le rpertoire


c:\zip_external\oracle, et WinZip a tout plac dans un rpertoire local.

L'ensemble fait 613 Megs, 2.103 fichiers dans 953 dossiers. Soit.

4.2 - Installation

Puis nous lanons l'installation:


nous cliquons sur setup.exe
un cran noir se prsente (un programme DOS) qui vrifie la version de l'OS (pas
de Windows 3, Windows 95, Windows 98 ...). Si les tests sont
concluants, Oracle Universal Installer (OUI) prsente un second cran, graphique
quant lui, est affich:
nous choisissons le mot de passe "mypass" pour les utilisateurs SYS, SYSTEM,
SYSMAN et DBSNMP. Nous tapons ce mot de passe 2 fois et cliquons "suivant"
OUI nous indique la place disque qui sera ncessaire:
nous cliquons "Installer"

l'installation est lance:


Comme l'installation du Serveur installe aussi une base de donnes, un
installateur de base est lanc:
et le succs de la configuration est confirm par:
De mme, lorsque la base de donnes est configure:
o nous voyons que:

le nom de la base est orcl (abrviation de ORaCle)


le nom de l'instance est orcl
nous pouvons lancer le gestionnaire de base en tapant
http://pol-1400:5500/em
(em= Enterprise Manager)

et OUI nous propose de dverrouiller des mots de passe.

C'est une tape que nous avions saut lors de la premire installation, et il a fallu
utiliser Sql-Plus pour dverrouiller Scott/Tiger. Pour ne pas faire cette erreur
cliquez "Gestion des mots de passe"

OUI prsente l'cran de gestion des mots de passe:

confirmez Scott / Tiger

OUI prsente l'cran de fin d'installation:


pour avoir une ide des produits installs, nous avons aussi cliqu "Produits
installs" (c'est naturellement optionnel):
OUI prsente:
nous fermons cette fentre.

Nous retournons dans la fentre d'installation que nous fermons en cliquent


"quitter"
OUI va lancer Enterprise Mangager. Pour cela Oracle dmarre Internet Explorer
(ou votre explorateur web) se lance, et prsente un cran de login:
nous tapons SYSMAN, mypass puis cliquons "se connecter"

l'cran d'EM est prsent:


Nous voyons, entre autre, que

l'instance est orcl


le rpertoire ("oracle home" dans les discussions)
est c:\oracle\product\10.1.0\Db_1
le service Windows qui coute les clients est LISTENER_pol-1400
notre PC est dsign par pol-1400

vous pouvez visiter quelques pages de ce gestionnaire, puis le fermer.


4.3 - Vrification du Serveur

OUI a cre un rpertoire c:\oracle contenant les fichiers du serveur et de la


base:

En tout 17.222 fichiers dans 2.178 dossiers. D'une faon gnrale

admin contient des traces


Db_1 est le serveur proprement dit
o admin contient des exemples de fichiers de paramtres, entre
autre initsmpl.ora utilis pour crer une nouvelle base
o BIN contient les outils (aussi accessibles depuis la barre de
tche)
o RDBMS\ADMIN qui contient les scripts de cration de base
oradata\orcl est la base de dmonstration cre par dfaut

Le Serveur va attendre les requtes clients, et ceci est ralis


sous Windows par le biais d'un service (aka un dmon Linux). Il y a d'autre
services qui sont crs et lancs lors de l'installation (tches planifies etc).
Pour savoir quels services sont lancs
nous lanons le panneau de configuration depuis la barre de tche (dmarrer |
paramtres | panneau de configuration) et slectionnons "outils d'administration"
puis "Services"
Windows nous prsente tous les services installs, et entre autres:
Nous pouvons prsent lancer l'outil de requte Sql-Plus. Il s'agit d'en
diteur spcialis, permettant

la connection
l'envoi de requtes SQL ou l'excution de scripts
des traitements d'administrations spcifiques

Nous lanons donc Sql-Plus


slectionnez dmarrer | Programmes | OraDb10g_home1 | Application
Development | Sql Plus

Sql-Plus nous demande qui nous sommes


nous tapons SYSMAN, mypass et orcl puis cliquons "OK"
Sql-Plus nous accueille:

nous tapons n'importe quelle requte correspondant une table systme, pour
vrifier que tout fonctionne:

SELECT * FROM all_users


Oracle rpond (partiel):
pour vrifier que le mot de passe utilisateur est correct, nous nous reconnectons a
Scott/Tiger et affichons la table EMP
Oracle rpond

5 - Installation du Client Oracle


5.1 - Dcompression

Nous dcomprimons le fichier .ZIP, ce qui nous fournit 377 Megs, 3093
fichiers dans 962 dossiers:
5.2 - Installation du Client Oracle

Nous cliquons setup.exe pour lancer l'installation du Client:


setup vrifie la compatibilit de notre OS:

Puis OUI affiche son cran:


Nous tapons "suivant"

OUI nous propose les chemins d'installation:


Nous tapons "suivant"
OUI charge les fichiers. Puis nous demande quel type d'installation nous
souhaitons procder:
nous slectionons "Runtime" et cliquons "Suivant"

OUI nous prsente la liste des produits clients:


nous cliquons "Installer"
Le tout dure environ 10 minutes.

OUI enchane avec l'assistant de configuration:


qui nous accueille ainsi:
nous cliquons "Suivant"
et ceci se termine par

nous cliquons "Terminer"


OUI reprend la main et annonce:

et nous confirmons

5.3 - Vrification Client

Le rpertoire Oracle contient les fichiers installs:


soit 3.803 fichiers dans 558 rpertoires.

Nous pouvons vrifier que nous pouvons nous connecter au Serveur, en


lanant un "Ping":

nous rcuprons l'adresse du Serveur

nous allons sur le PC du Serveur


Nous lanons une fentre DOS, puis tapons IpConfig Entre
Windows indique:

Donc l'adresse de notre PC est 192.168.0.2

nous lanons TnsPing depuis le Client:

nous lanons une fentre DOS sur le Client et tapons TnsPing 192.160.0.2:
Nous constatons (OK) que le "ping" a bien russi

Peut tre avez vous not que nous n'avons nulle part indiqu comment se
connecter au Serveur.

Pour placer ces informations dans un fichier de paramtre, nous utilisons


ne Net Mangager

nous lanons net Manager par "dmarrer | programmes | OraClient10g_home1 |


configuration and Migration Tools | Net Manager"

voici le gestionnaire:
nous testons la prsence d'un fichier de rsolution de noms en cliquant sur
"rsolution de noms"
le Tree View ne s'expande pas: il n'y a pas de noms

nous cliquons le gros "+" en haut gauche pour lancer l'assistant de saisie de
noms
l'assistant prsente sa page d'accueil:

nous entrons un nom. Dans notre cas my_name_resolution

Nous cliquons "Suivant"


l'assistant nous demande quel protocol nous souhaitons utiliser:
nous laissons TCP IP et cliquons "Suivant"
l'assistant nous demande le nom du domaine contenant le Serveur

nous tapons pol-1400 et cliquons "Suivant"

l'assistant nous demande le nom du service


nous tapons ORCL puis cliquons "Suivant"
l'assistant nous propose un test:

nous cliquons "Test"


nous cliquons "Fermer", puis "Terminer"

Net Manager nous prsente le rsultat de notre configuration:


nous quittons Net Manager (par l'icne de fermeture, ou Alt-F4)
Net Manager nous demande si nous souhaitons sauvegarder nos paramtres

nous cliquons "Enregistrer"


Nous pouvons vrifier que les paramtres ont bien t sauvegards. Voici le
contenu du fichier c:\oracle\produce\10.1.0\Client_1\NETWORK\
ADMIN\tnsnames.ora:

o vous reconnatrez "my_name_resolution", "tcp-ip", "orcl" etc

Finalement nous allons lancer une requte en utilisant Sql-Plus ct client:

nous slectionnons "dmarrer | programmes | OraClient10g_home1 | configuration


and Migration Tools | Net Manager"

Sql-Plus nous demande qui nous sommes:

nous tapons scott tiger my_name_resolution "ok"


Sql-Plus nous accueille:
nous tapons SELECT * FROM EMP; etc.

6 - La programmation d'applications Oracle


Pour crer des application Oracle, nous pouvons utiliser

Sql Plus pour des requtes ponctuelles


les outils de dveloppement Oracle.
o Oracle Forms
o les outils Web
des outils tiers, tels que Forte. J'ai essay de lancer l'outil et ai
abandonn au bout de deux heures. Le Canard Enchan du 6 Avril
2005 indique que je ne suis pas le seul avoir eu des problmes ...
des langages de programmation pouvant communiquer avec Oracle,
au niveau Serveur ou surtout Client, comme, par exemple, Delphi

A ce jour, Delphi nous semble l'outil le plus efficace pour raliser des
applications Oracle, et nous prsenterons les techniques dans les prochains
articles.
Tutorial ORACLE - John COLIBRI.
rsum : ralisation d'applications Base de Donnes Client
Oracle, avec connection au Serveur, cration de Tables, ajout /
lecture / modification de donnes
mots cl : Client Oracle - CREATE TABLE, SELECT,
INSERT, UPDATE, dbExpress, DataSnap, modle nomade,
relation matre dtail
logiciel utilis : Windows XP personnel, Delphi 6.0, Oracle
10g
matriel utilis : Pentium 1.400Mhz, 256 M de mmoire, 140
Giga disque dur
champ d'application : Delphi 1 2005 sur Windows, Oracle
niveau : dveloppeur Delphi / Oracle
plan :
o Introduction
o Vrification de l'Accs au Serveur
o Architecture de l'Application Client
o La Connection Oracle
o Cration de Tables Oracle
o Ajout de Donnes
o Affichage des Donnes
o Le mode Nomade
o Modification de Donnes
o Tlcharger le code source

1 - Introduction
Nous allons prsenter ici comment grer une application Client Oracle en
utilisant les composants Delphi. Aprs la lecture de cet article, vous saurez:

crer une Table et ses indexes


lire, crire et modifier les donnes de cette table
travailler en mode nomade (non connect au Serveur)
grer plusieurs tables lies

2 - Vrification de l'Accs au Serveur


Dans les articles prcdents, nous avons prsent:

installation_oracle_10g: comment tlcharger le Serveur et


le Client Oracle et comment installer et vrifier ces deux logiciels
create_database_oracle_10g : comment crer une nouvelle base de
donnes Oracle

Nous utiliserons les paramtres par dfaut Oracle classiques:

nom d'utilisateur: SCOTT


mot de passe: TIGER

Si votre administrateur vous a fourni d'autres noms d'utilisateur / mot de


passe, vous remplacerez SCOTT/TIGER par vos valeurs.

Si vous utilisez une base dj installe, voici comment vrifier que vous
arrivez bien communiquer avec votre Serveur Oracle:

si vous travaillez directement sur le PC sur lequel est install


le Serveur:

chargez l'outil graphique SqlPlus (dmarrer | Programmes |


OraDb10g_home1 | Application Development | Sql Plus)

Sql-Plus nous demande qui nous sommes


nous tapons SCOTT, TIGER et ORCL puis cliquons "OK"
Sql-Plus nous accueille:

nous affichons la table EMP (ou n'importe quelle autres requte


correspondant une table)

SELECT * FROM emp; Entre


Oracle rpond

Notez que "Host String" correspond au paramtre qui se trouve dans


"OracleHome"\NetWork\ADMIN\tnsnames.ora:

# tnsnames.ora Network Configuration File:


C:\oracle\product\10.1.0\Db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = pol-1400)(PORT =
1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

si vous souhaitez placer votre application sur le PC contenant


le Client Oracle (ce qui est plus classique, mais oblige utiliser 2
PC), depuis le PC contenant le Client:

slectionnez "dmarrer | programmes | OraClient10g_home1 | application


Developpments | SQL Plus"

Sql-Plus nous demande qui nous sommes:


nous tapons SCOTT, TIGER et MY_NAME_RESOLUTION puis
cliquons "OK"
Sql-Plus nous accueille:

nous affichons la table EMP (ou n'importe quelle autres requte


correspondant une table)

SELECT * FROM emp; Entre


le Serveur renvoie le contenu de cette table

Notez que "Host String" correspond au paramtre qui se trouve dans


"OracleHome"/NetWork/ADMIN/tnsnames.ora:

# tnsnames.ora Network Configuration File:


C:\oracle\product\10.1.0\Client_1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.

MY_NAME_RESOLUTION =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = pol-1400)(PORT =
1521))
)
(CONNECT_DATA =
(SERVICE_NAME= ORCL)
)
)

3 - Architecture de l'Application Client


Le fonctionnement Client / Serveur traditionnel est organis avec
un Serveur qui rpond plusieurs Clients, chacun situ sur des PC
diffrents:

Prenons le cas d'un Client particulier:

lorsque ce Client souhaite communiquer avec le Serveur, il envoie


une requte via le rseau:
et le Serveur rpond, en un ou plusieurs paquets:

Du ct du Client, nous avons les couches logicielles suivantes:

au niveau le plus bas, le PC est quip des couches rseau. La pile


TCP/IP par exemple, qui est installe automatiquement par Windows:
cette couche est attaque par le Client Oracle (appele jadis SqlNet)
qui a t installe lors de l'installation Client Oracle:

le Client Oracle est attaqu par les composants d'accs Delphi, qui
communiqueront avec l'application utilisateur en utilisant les
contrlesDelphi:
et finalement l'application utilisateur (comptabilit, facturation,
portail web pour un catalogue client etc):

Au niveau Delphi, les tapes d'une communication sont les suivantes:

le Client Delphi tablit la connection


puis, pour chaque requte:
o le Client envoie sa requte
o le Client rcupre la rponse
le Client ferme la connection

Ces trois tapes peuvent tre ralises par diffrents types de composants
Delphi:
le BDE (Borland Database Engine)
les composants dbExpress
des composants Ado (la mcanique Microsoft)
des composants crits spcialement pour grer en Delphi des bases de
donnes Oracle

Nous utiliserons ici les composants dbExpress fournis avec Delphi. Ces
composants comportent:

tSqlConnection qui sert tablir la connection avec le Serveur. C'est


l que nous fournissons les paramtres Oracle (SCOTT, TIGER,
ORCL):

SqlQuery qui permet d'envoyer des requtes Sql vers le Serveur et qui
reoit les rponses. C'est ce niveau seul que nous envoyons les
requtes SQL. Nous pouvons d'ailleurs travailler avec ce niveau seul,
pour crire des donnes en mode batch par exemple.
tDatasetProvider qui transforme les rponses du Serveur en paquets
au format normalis Delphi.
tClientDataSet qui stocke en mmoire les donnes reues
du Serveur et permet des mise en forme de ces donnes (tri, filtrage,
navigation, sauvegarde locale etc):
tDataSource et tdbGrid (ou autres tdbEdit, tdbListbox ...) qui
prsentent les donnes l'utilisateur et lui permettent de les modifier:
4 - La Connection Oracle
Voici comment ouvrir une connection depuis le Client:
crez une nouvelle application Delphi, et nommez-la p_oracle_dbx_connect.dpr
dans la page dbExpress de la Palette slectionnez SqlConnection:

et posez ce composant sur la Forme


pour fournir les paramtres de login, double cliquez sur SqlConnection1
Delphi ouvre l'diteur de connexion:
slectionnez le pilote Oracle, et tapez les paramtres de connection (SCOTT,
TIGER, ORCL):

Notez que ORCL est le nom qui apparat dans votre fichier tnsnames.ora:
Ainsi, si nous nous tions connect depuis le PC Client, nous aurions du utiliser
MY_NAME_RESOLUTION au lieu de ORCL (cf le paragraphe 2 ci-dessus). Et
vous aurez utiliser votre nom figurant dans votre fichier tnsnames.ora.
fermez l'diteur de connection
pour viter d'avoir taper sempiternellement SCOTT/TIGER, slectionnez dans
l'inspecteur d'objet LoginPrompt et basculez sa valeur surFalse.

Puis tablissez la connection en basculant Connected sur True

au bout de quelques instants Connected bascule sur True, indiquant que la


connection est effectivement tablie.

Si tel n'tait pas les cas, revoyez les tapes prcdentes une une.
rebasculez Connected sur False. En effet les diffrents
composants Delphi forceront l'ouverture de la connection lorsqu'ils en auront
besoin.
Vous pouvez tlcharger cette application en
cliquant oracle_dbx_connect.zip.

5 - Cration de Tables Oracle


5.1 - Principe

Nous allons crer une table contenant pour chaque formation:

un code (par exemple 8)


un nom (par exemple "Delphi Oracle")
un prix (par exemple 1.400)

Pour cela nous devons envoyer une requte en langage SQL vers
le Serveur Oracle.

La syntaxe de cette requte est:

CREATE TABLE formations


(f_numero INTEGER, f_nom CHARACTER(11),
f_jours INTEGER, f_prix NUMERIC(5, 2) )

Il suffit donc de choisir un nom de table, et le nom de chaque colonne avec


son type.

Parmi les types autoriss par Oracle et correspondant aux types SQL usuels
citons:

les nombres:
o NUMERIC(decimales, prcision) pour une valeur numrique
flottante, avec 38 chiffres significatifs
o de nombreuses variantes
(INTEGER, SMALLINT FLOAT, REAL ) existent, la fois
pour des raisons de portabilit et pour amliorer le nombre de
chiffres significatifs
les chanes de caractres:
o CHARACTER(taille) pour chanes avec allocation fixe, taille
maximale 2000 caractres
o NVARCHAR2(taille) pour les chanes avec allocation
dynamique, taille maximale 32.767 caractres
les dates:
o DATE et TIMESTAMP

Pour envoyer cette requte vers le Serveur:

nous utilisons un tSqlConnection qui assurera la connection vers


le Serveur
nous utilisons un tSqlQuery
o nous le relions tSqlConnection
o nous plaons la requte SQL dans sa
proprit tSqlQuery.SQL (via l'Inspecteur ou en code)
o nous appelons tSqlQuery.ExecSql

5.2 - Utilisation de SQL

La requte envoyer au Serveur est place


dans tSqlQuery.Sql. tSqlQuery.Sql est un descendant de tStrings. Nous
pouvons donc utiliser, par exemple:
SqlQuery1.Sql.Add('CREATE TABLE formations (f_numero INTEGER, f_no
m CHARACTER(11))');

Pour construire la requte:

nous pouvons utiliser Add pour ajouter une ligne de


requte, Text pour affecter une requte, Clear pour purger tout texte
antrieur, ou mmeLoadFromFile pour lire un fichier .txt contenant la
requte:

SqlQuery1.Sql.LoadFromFile('cree_formation.txt');

La mise en page n'a aucune importance pour le Serveur: la requte peut tre
rpartie en plusieurs lignes:

SqlQuery1.Sql.Add('CREATE TABLE');
SqlQuery1.Sql.Add(' formations ');
SqlQuery1.Sql.Add(' (f_numero INTEGER, f_nom CHARACTER(11))');

nous pouvons entrer la requte en utilisant l'Inspecteur d'Objet. Si


nous cliquons sur Sql, Delphi affiche:

et vous pouvez taper manuellement la requte dans la fentre du


Memo
nous pouvons aussi crer la String en plusieurs tapes par toutes les
primitives de String telles que la concatnation, Insert, le test
par Pos ou autre. Par exemple:

l_requete:= 'CREATE TABLE '+ Edit1.Text+ ' (';


l_requete:= l_requete+ Edit2.Text+ ')';
SqlQuery1.Sql.Add(l_requete);

5.3 - Comment a Marche

Au niveau fonctionnement:

lorsque nous construisons la requte par SqlQuery.Sql.Add, ce texte


de requte est ce stade une tStrings en mmoire de notre PC.
C'est une tStrings comme n'importe quelle autre. Ce qui explique
qu'aucune vrification de syntaxe n'est effectue.
Lorsque nous excutons:

SqlQuery1.ExecSql;

alors:
o la requte est envoye au Serveur via le Client
o le Serveur traite la requte et:
cre la table si la requte est correcte:
retourne une erreur transforme par Delphi en exception
en cas de problme

Notez que l'envoi de toute requte qui modifie des donnes du Serveur (et la
cration d'une nouvelle table est bien une modification) ne peut se faire que
par du code (et non PAS en basculant SqlQuery1.Active sur True en mode
conception)

5.4 - L'application

Pour crer notre table


crez une nouvelle application et appelez-la "p_oracle_dbx_create_table.dpr"
ajoutez un tSqlConnection sur la Forme (comme dtaill ci-dessus):

dans la page "dbExpress" de la Palette, slectionnez SqlConnection et


posez-le sur la Forme
double cliquez pour ouvrir l'diteur de connection, slectionnez ORACLE
puis remplissez SCOTT/TIGER/ORCL
dans l'Inspecteur d'Object, basculez LoginPrompt sur False
vrifiez la connection en basculant Connected sur True, puis rebasculez la
valeur sur False

slectionnez dans la page "dbExpress" de la Palette le composant SqlQuery:


slectionnez sa proprit SqlConnection et initialisez-la

SqlConnection1
placez un tButton sur la Forme et crez sa mthode OnClick. Placez-y les
instructions de cration:

procedure TForm1.create_table_Click(Sender: TObject);


begin
with SqlQuery1 do
begin
Close;

with Sql do
begin
Clear;
Add('CREATE TABLE formations');
Add(' ('
+' f_numero INTEGER,');
Add(' f_nom CHAR(23),');
Add(' f_jours SMALLINT,');
Add(' f_prix NUMERIC(5, 2)');
Add(' )');
end; // with Sql

Try
SqlConnection1.Open;

ExecSql;
except
on e: Exception do
begin
display(' *** pb_create '+ e.Message);
end;
end;
end; // with SqlQuery1
end; // create_table_Click

compilez, excutez, et cliquez le bouton


Vous pouvez tlcharger le sources du projet "ib_dbx_create_table.zip".

5.5 - Effacer une table

Pour supprimer une Table, il faut excuter la requte:


DROP TABLE formations

Donc:

placez un autre tButton sur la Forme et placez-y la requte de suppression:

procedure TForm1.drop_table_Click(Sender: TObject);


begin
with SQLQuery1 do
begin
Close;

with Sql do
begin
Clear;
Add('DROP TABLE formations');

Try
ExecSql;
except
on e: Exception do
display(' *** pb '+ e.Message);
end;
end; // with Sql
end; // with SQLQuery1
end; // drop_table_Click

compilez, excutez, et cliquez le bouton

Notez que:

nous avons le mme SqlQuery en changeant le contenu de sa


proprit SQL. Nous aurions aussi bien pu utiliser
des SqlQuery spars.
5.6 - Vrifier la cration

Nous pouvons vrifier que la cration d'une table a t effectue

soit en excutant DROP TABLE: si la table n'existe pas,


le Serveur Oracle provoquera une exception.
soit en excutant SELECT * FROM formations, que nous allons
prsenter ci-dessous
soit en excutant SELECT * FROM user_tables qui affiche toutes les
tables de SCOTT/TIGER. Nous allons prsenter SELECT ci-dessous

5.7 - Cration de deux autres tables

Ajoutons deux autres tables notre exemple: une table pour les lieux des
formation, et une table pour les dates.

Nous pourrions utiliser des procdures similaires aux prcdentes, mais un


examen superficiel montre que seul le contenu de la requte SQL change. Il
est donc trs simple de crer une procdure do_execute_sql qui utilise cette
requte comme paramtres, et que nous utiliserons pour les autres
traitements:

procedure do_execute_sql(p_sql: String);


begin
with Form1, SqlQuery1, Sql do
begin
Close;

Clear;
Add(p_sql);

Try
SqlConnection1.Open;

ExecSql;
except
on e: Exception do
display(' *** pb_create '+ e.Message);
end; // try
end; // with SqlQuery1
end; // do_execute_sql

Nous alors crer une table des villes, comportant un numro de ville et un
nom de ville, et nous imposerons une contrainte d'unicit au numro. En
utilisant la procdure prcdente, la mthode utilise est:

procedure TForm1.create_table_villes_Click(Sender: TObject);


begin
do_execute_sql(
'CREATE TABLE villes'
+ ' ('
+ ' v_numero INTEGER NOT NULL PRIMARY KEY,'
+ ' v_nom CHAR(30)'
+ ' )');
end; // create_table_villes_Click

Et pour effacer cette table, nous utiliserons:

procedure TForm1.drop_villes_Click(Sender: TObject);


begin
do_execute_sql('DROP TABLE villes');
end; // drop_villes_Click

Nous utiliserons donc la procdure do_execute_sql pour les autres


instructions de cration / modification / effacement de tables.

Notre premire table n'tait pas dote d'une cl unique. Nous pouvons
corriger la dclaration par une instruction SQL ALTER .

ALTER TABLE formations


ADD CONSTRAINT pk_formation PRIMARY KEY (f_numero)
La table FORMATIONS et la table VILLES tant dotes de cls primaires,
nous pouvons crer une table DATES qui contient des rfrences vers les
deux tables prcdentes:

CREATE TABLE dates


(
d_formation_ref INTEGER,
d_ville_ref INTEGER,
d_date DATE,
CONSTRAINT fk_formation
FOREIGN KEY (d_formation_ref)
REFERENCES formations (f_numero),
CONSTRAINT fk_ville
FOREIGN KEY (d_ville_ref)
REFERENCES villes (v_numero)
)

Nous vous laissons le soin d'ajouter au projet prcdent les boutons avec le
code pour crer (et effacer) les deux autres tables. Le texte complet se trouve
bien sr dans oracle_dbx_create_table.zip .

Notez que:

le schma correspondant aux trois tables que nous avons cr est le


suivant:
connaissant le schma, nous aurions pu directement crer la table
formation avec sa contrainte de cl primaire (vitant ALTER )
notez que lorsque nous crons la table des DATES qui rfrence les
deux autres, celles-ci DOIVENT avoir t cres et DOIVENT avoir
les champs dsigns dans les contraintes FOREIGN KEY
de faon symtrique, si nous souhaitons effacer les tables, il faut
d'abord effacer DATES, puis VILLES et FORMATIONS (si nous
essayons d'effacer FORMATIONS en premier, le Serveur signale
qu'il existe une rfrence vers cette table depuis DATES)
nous avons fourni dans les tutoriaux Interbase des exemples de
construction de tables partir d'un schma fourni dans un fichier
.TXT
nous aurions pu de mme gnrer les instructions de cration de table
partir de notre outil UML qui a t utilis pour le schma prcdent.

Voici une image de cette petite application lorsque nous avons cr les trois
tables:

6 - Ajout de Donnes
6.1 - Ajout simple

Ajoutons un enregistrement pour le stage

3, Oracle Delphi

L'instruction SQL est:

INSERT INTO formations


(f_numero, f_nom)
VALUES (3, 'Oracle Delphi')

L'ajout d'enregistrement va modifier les donnes du Serveur, donc nous


utiliserons tSqlQuery.ExecSql.

De faon dtaille:

crez une nouvelle application et nommez-la "p_oracle_dbx_insert_data"


placez un tSqlConnection sur la Forme

Cliquez deux fois sur SqlConnection1, renseignez "Driver Name",


"Connection Name", "DataBase", "User Name" et "Pass Word".
dans l'Inspecteur d'Objet, basculez LoginPrompt sur False, et vrifiez la
connection en basculant SqlConnection1.Connected sur True, puis fermez
la connection.

placez un tSqlQuery sur la tForme

slectionnez sa proprit SqlConnection et initialisez-la SqlConnection1

placez un tButton sur la Forme et crez sa mthode OnClick. Placez-y les


instructions d'ajout:
procedure TForm1.insert_Click(Sender: TObject);
begin
with SqlQuery1 do
begin
Close;

with Sql do
begin
Clear;
Add('INSERT INTO formations');
Add(' (f_numero, f_nom)');
Add(' VALUES (3, ''Oracle Delphi'')');
end;

Try
ExecSql;
except
on e: Exception do
display(' *** pb_insert '+ e.Message);
end;
end; // with SqlQuery1
end; // insert_Click

compilez, excutez, et cliquez le bouton

Vous pouvez tlcharger les sources du projet "oracle_dbx_insert_data.zip".

6.2 - Type CHARACTER

Pour spcifier les valeurs CHARACTER, Sql exige que la chane soit
entoure de guillemets. Suivant les Serveurs, il faut utiliser un guillemet
simple ou double:
VALUES (3, 'Oracle Delphi')

ou

VALUES (3, "Oracle Delphi")

De plus si notre valeur est niche dans une String Pascal, il faut ddoubler
les guillemets simples

SqlQuery1.Sql.Add(' VALUES (3, ''Oracle Delphi'')');

Pour simplifier cet imbroglio de guillemets, Delphi propose la


mthode QuotedStr:

IbQuery1.Sql.Add(' VALUES (3, '+ QuotedStr('Oracle')+ ')');


6.3 - Type NUMERIC

Pour les valeurs numriques avec dcimales, nous devons batailler avec les
points et les virgules:

aux US, la partie entire est spare de la partie dcimale par un


point:

3.1415

alors qu'en Europe nous disons

3,1415

les valeurs que nous tapons en PASCAL doivent donc respecter la


syntaxe US
mais si nous utilisons des primitives de conversion interface
utilisateur <=> Delphi, Delphi lit les paramtres de localisation dans
la base de registre Windows. Pour ma machine il est dit que le
sparateur dcimal est la virgule. Par consquent les fonctions telles
que:

FloatToStr

attendent une virgule

Nous pouvons imposer le sparateur utiliser en spcifiant:

DecimalSeparator:= '.';

La rgle est donc simple:

les valeurs Delphi (Double ou autre) utilisent le point '.'


les composants visuels (tEdit etc) et les primitives de conversion
(FloatToStr) utilisent la virgule ','

6.4 - Type DATE

Un problme similaire intervient pour les dates:

Sql utilise le format US "anne mois jour". EXCLUSIVEMENT


suivant le type de primitive, Delphi utilisera un format US ou
Europanis (via le panneau de configuration Windows, ou des
primitives de formatage)
le sparateur doit tre un slash / (et non pas un tiret ou autre)

2004/03/29

les dates doivent tre entoure de guillemets:

'2004/03/29'

car sinon Delphi effectue une division et calcule un Double, assimil


un tDateTime, et traduit en une date

En supposant que nous souhaitions fournir la date du 29 Mars 2004, nous


pouvons utiliser:
INSERT INTO dates
(d_numero, d_date)
VALUES (3, '2004/03/29')

et:

SqlQuery1.Sql.Add('INSERT INTO dates');


SqlQuery1.Sql.Add(' (d_numero, d_date');
SqlQuery1.Sql.Add(' VALUES (3, ''2004/03/29'')');

6.5 - Automatisation de l'Ajout

Les valeurs insrer ont t figes dans notre code. Nous pouvons
gnraliser cet ajout

soit en mode interactif.


soit par une procdure amplement paramtre
soit par des scripts

Nous allons prsenter ici l'utilisation d'une procdure paramtre.

En fait il n'y a rien de nouveau par rapport la technique ci-dessus, sauf que
la chane de la requte est construite en fonction de paramtres de la
procdure
la procdure appelante envoie les paramtres requis

Voici un exemple de procdure gnrique d'ajout:


procedure insert_generic(p_number: Integer; p_name: String; p_days: Integer; p_co
st: Double);
begin
with Form1, SqlQuery1 do
begin
Close;

with Sql do
begin
Clear;
Add('INSERT INTO formations');
Add(' (f_numero, f_nom, f_jours, f_prix)');
DecimalSeparator:= '.';
Add(' VALUES ('+ IntToStr(p_number)+ ', '+ QuotedStr(p_name)
+ ', '+ IntToStr(p_days)+ ', '+ FloatToStr(p_cost)+ ')');
DecimalSeparator:= ',';
end;

Try
ExecSql;
except
on e: Exception do
display(' *** pb_insert '+ e.Message);
end;
end; // with SqlQuery1
end; // insert_generic

Et voici un exemple de procdure appelante

procedure TForm1.insert_generic_Click(Sender: TObject);


begin
insert_generic(1, 'Initiation Delphi', 3, 1400.40);
insert_generic(2, 'Bases de Donnes Delphi', 3, 1400);
insert_generic(3, 'Oracle Delphi', 3, 1400);
insert_generic(4, 'Composants Delphi', 3, 1400);
insert_generic(5, 'UML et Patterns Delphi', 3, 1400);
insert_generic(4, 'Initiation Pascal', 4, 1900);
end; // insert_generic_Click
Notez que:

la procdure appelante pourrait aussi bien lire ses donne d'une autre
source (un fichier FILE OF, un fichier ASCII ("comma separates
values" ou autre), un autre table (Oracle, Sql Serveur ou mme une
autre table Interbase...)
le paramtres p_cost est de type Double:
o la procdure appelante envoie une valeur littrale avec un point
dcimal

insert_generic(2, 'Bases de Donnes Delphi', 3, 1.400);

o la procdure appele utilise FloatToStr, qui attend une virgule


dcimale. Nous forons donc temporairement l'utilisation du
point:

DecimalSeparator:= '.';
Add(' VALUES ('+ IntToStr(p_number)+ ... + FloatToStr(p_co
st)+ ')');
DecimalSeparator:= ',';

Le fichier oracle_dbx_insert_data.zip contient aussi l'ajout utilisant un tEdit,


ainsi qu'un ajout depuis un script de paramtres ASCII.

Pour vrifier que nos ajouts ont effectivement russi, nous avons ajout
notre application trois boutons qui ouvrent chaque table et comptent
simplement le nombre de fiches.

const k_select_formations= 'SELECT * FROM formations';

procedure select(p_query: String);


var l_count: Integer;
begin
with Form1 do
begin
with SqlQuery1 do
begin
Close;
Sql.Text:= p_query;
Open;
l_count:= 0;
While not Eof do
begin
Inc(l_count);
Next;
end; // while not Eot

display(' ok, '+ IntToStr(l_count)+ ' lines');


end; // with SqlQuery1
end; // with Form1
end; // select

procedure TForm1.select_Click(Sender: TObject);


begin
select(k_select_formations);
end; // select_Click

Notez que pour lire les donnes nous avons utilis SqlQuery1.Open (alors
que pour crire des donnes, nous avons utilis tSqlQuery.ExecSql).

Le vritable affichage du contenu de chaque ligne nous allons le raliser


maintenant, et en utilisant un tClientDataSet.

7 - Affichage des Donnes


7.1 - Principe de la lecture de donnes

Nous avons vu que pour crire des donnes (crer une table, ajouter des
donnes) SqlQuery envoyait une requte d'criture, le Serveur effectuait
l'criture, et ne retournait quasiment rien (au mieux un message d'erreur).

La situation est tout fait diffrente pour la lecture. L'instruction SELECT a


pour seul but de rcuprer ct client des donnes correspondant une ou
plusieurs tables qui existent dans la base de donne.

Ce qui change, ct Client, c'est qu'il va falloir stocker les lignes de donnes
correspondant la table constituant la rponse. Certes, il arrive que la
rponse ne contienne qu'un entier (SELECT COUNT ... ), mais mme dans
ce cas, le rsultat est considr comme une table d'une ligne et d'une
colonne. Et par consquent les composants lis SqlQuery doivent tre prts
effectuer ce stockage.

Voici le schma de l'excution d'un SELECT :

le Serveur contient une table "formations"

le Client envoie une requte

SELECT * FROM formations

la requte est envoye vers le Serveur


le Serveur construit une NOUVELLE TABLE correspondant la
requte (mme si elle sera identique une table existante)

les lignes de cet "answer set" sont envoys en un ou plusieurs paquets


vers le Client:
le Client stocke les lignes et les traite:

Le type de stockage ct Client dpend de la suite de composants utiliss:

si nous travaillons directement en OCI (Oracle Call Interface : le


langage de base du Client Oracle), c'est avant d'envoyer SELECT que
nous allouons un tampon mmoire pour la rponse
si nous utilisons le BDE (Borland Database Engine: le premier
moteur de base de donnes de Delphi, en 1996), c'est le BDE qui
stockait la rponse dans des tampons, et le composant tQuery copiait
dans un autre tampon les lignes correspondant au tdbGrid ayant le
plus de lignes:

si nous utilisons dbExpress (ce qui est le cas dans cet article), le
rsultat est stock par le tClientDataSet:
7.2 - Lecture dans un tClientDataSet

Voici notre premire application pour afficher les donnes:


crez une nouvelle application et nommez-la "p_oracle_dbx_read_data"
slectionnez dans la page "dbExpress" de la Palette le
composant SqlConnection et posez-le sur la tForm.
Cliquez deux fois sur SqlConnection1, renseignez
"Driver Name" -> Oracle
"DataBase" -> ORCL
"User Name" -> SCOTT
"Pass Word" -> TIGER
Allez dans l'Inspecteur d'Objet:

slectionnez LoginPrompt et basculez sa valeur sur False


vrifiez la connection en basculant Connected sur True, puis fermez la
connection en basculant Connected sur False.

slectionnez dans la page "dbExpress" de la Palette le composant SqlQuery et


posez-le sur la tForm.
Slectionnez sa proprit SqlConnection et initialisez-la SqlConnection1
slectionnez sa proprit SQL, cliquez sur l'ellipse ... pour ouvrir l'diteur
de chanes de caractres et tapez-y la requte:

SELECT * FROM formations

cliquez sur "OK" pour ferme l'diteur

slectionnez dans la page "Data Access" de la Palette le


composant DatasetProvider:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez SqlQuery1

slectionnez dans la page "Data Access" de la Palette le


composant ClientDataSet:
Posez-le sur la tForm.
dans sa proprit ProviderName slectionnez DatasetProvider1

slectionnez dans la page "Data Access" de la Palette le composant DataSource:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez ClientDataSet1

slectionnez dans la page "Data Controls" de la Palette le composant dbGrid:

Posez-le sur la tForm.


dans sa proprit DataSource slectionnez DataSource1

slectionnez sur la Forme SqlClientDataSet1, et basculez sa


proprit Active True
dbExpress envoie la demande d'ouverture DataSetProvider1, qui la transmet
SqlQuery1, qui connecte la base, recherche les donnes et les propage par le
chemin inverse dans la dbGrid: vous voyez les donne affiches:
Notez l'ordre de chanage des composants:

Cet ordre provient des multiplicits possibles:

une tSqlConnection peut tre relie plusieurs tSqlQueries


un tSqlQuery peut tre reli plusieurs tDatasetProviders
un tDataSetProvider peut alimenter plusieurs tClientDatasets
un tClientDataSet peut tre reli plusieurs tDataSource
un tDataSource peut tre reli plusieurs composants visuels tels que
la tdbGrid
Si Delphi avait propos au dveloppeur programmeur de
relier tSqlConnection ses tSqlQueries, il aurait fallu prvoir une LISTE
de tSqlQueriesassocis, alors que dans l'ordre inverse, chaque tSqlQuery ne
peut avoir qu'une tSqlConnection, donc une seule ligne dans
l'Inspecteur d'Objet.

En conclusion, SQL comporte deux catgories de requtes:

les requtes qui crivent des donnes sur le Serveur (cration, envoi
de donnes, modifications ...). Ces requtes sont lances
en dbExpresspar SqlQuery.ExecSql
les requtes de lecture qui vont recevoir une table rponse du Serveur,
et qui sont lances en dbExpress par SqlQuery.Open (ou son
quivalent au niveau de Inspecteur d'Objet: SqlQuery.Active:= True)

SqlQuery.ExecSql n'a aucun quivalent dans l'Inspecteur d'Objet et ne peut


tre lanc qu'en excutant le programme (alors que SqlQuery.Activepeut tre
bascul en mode conception)

Vous pouvez tlcharger le sources du projet "oracle_dbx_read_data.zip".

8 - Le mode Nomade
8.1 - Principe

Nous avons vu que le tClientDataSet stockait TOUTES les lignes du rsultat


en mmoire.

Ce stockage choque tout le monde au dpart: y aura-t-il toujours assez de


place ?

En fait il faut se rendre l'vidence que l'utilisateur ne travaille jamais sur


toutes les donnes de la base en mme temps. Lorsque le prpos d'EDF
vient visiter les clients du 9ime, il n'est concern que par les utilisateurs de
cet arrondissement. Il n'a aucun intrt tlcharger sur son appareil de
relev les 17 millions d'abonns d'EDF de France: seuls ceux de sa tourne
le concernent. Il en est de mme pour les autres traitements utilisateurs.
C'est donc au dveloppeur de formuler ses requtes pour ne rappatrier vers
le tClientDataSet que les donnes que l'utilisateur va rellement utiliser.

Dans ces conditions, le tClientDataset est capable de contenir toutes les


donnes traiter: pour l'affichage, mais aussi pour les modifications.

De plus l'utilisateur peut:

sauvegarder les donnes du tClientDataSet localement dans un fichier


du PC client

fermer son PC
allumer son PC plus tard (en dplacement), recharger les donnes
du tClientDataSet et les utiliser (lecture, modification), puis
sauvegarder les modifications:
de retour au bureau, rallumer son PC, recharger les donnes
modifies et mettre jour les tables du Serveur
8.2 - Sauvegarde du ClientDataSet

Pour dmontrer le fonctionnement nomade (BriefCase en anglais), nous


allons volontairement utiliser 3 applications spares, pour bien dmontrer
que le tClientDataset peut tre utilis sans aucune connection
au Serveur Oracle

Tout d'abord, la premire application qui charge le tClientDataset depuis


le Serveur, et sauvegarde sur disque. Voici comment sauvegarder le contenu
du ClientDataSet:

crez une nouvelle application et nommez-la "p_oracle_dbx_save_cds"


placez un tSqlConnection sur la Forme

Cliquez deux fois sur SqlConnection1, renseignez "Driver Name"


(ORACLE), "DataBase" (ORCL), "User Name" (SCOTT)et "Pass Word"
(TIGER).
dans l'Inspecteur d'Objet, basculez LoginPrompt sur False, et vrifiez la
connection en basculant SqlConnection1.Connected sur True, puis fermez
la connection.

slectionnez dans la page "dbExpress" de la Palette le composant SqlQuery et


posez-le sur la tForm.

Slectionnez sa proprit SqlConnection et initialisez-la


SqlConnection1
slectionnez sa proprit SQL, cliquez sur l'ellipse ... pour ouvrir l'diteur
de chanes de caractres et tapez-y la requte:
SELECT * FROM FORMATIONS
cliquez sur "OK" pour ferme l'diteur

slectionnez dans la page "Data Access" de la Palette le


composant DatasetProvider:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez SqlQuery1

slectionnez dans la page "Data Access" de la Palette le


composant ClientDataSet:

Posez-le sur la tForm.


dans sa proprit ProviderName slectionnez DatasetProvider1

slectionnez dans la page "Data Access" de la Palette le composant DataSource:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez ClientDataSet1

slectionnez dans la page "Data Controls" de la Palette le composant dbGrid:

Posez-le sur la tForm.


dans sa proprit DataSource slectionnez DataSource1

posez un tButton sur la Forme et faites lui ouvrir ClientDataset1:


ClientDataset1.Open;
posez un tButton sur la Forme et faites lui sauvegarder le contenu actuel
de tClientDataset:
ClientDataset1.SaveToFile('RESU.XML');
compilez et excutez. Ouvrez le tClientDataSet et sauvegardez son contenu

le tClientDataset sauvegarde les donnes

utilisez un explorateur Windows pour vrifier que le fichier est bien sur disque:
Si vous cliquez sur RESU.XML, Windows va ouvrir Internet Explorer qui va
afficher, tant bien que mal, le contenu de cet fichier .XML (vue partielle):

Notez que:
l'affichage (tDataSource et tdbGrid) n'est pas ncessaire, mais permet
une vrification rapide avant sauvegarde

8.3 - Travail en mode dconnect (Briefcase)

A prsent utilisons le CDS sans tre connect au Serveur:


crez une nouvelle application et nommez-la "p_oracle_dbx_briefcase"
slectionnez dans la page "Data Access" de la Palette le
composant ClientDataSet et posez-le sur la tForm.
slectionnez dans la page "Data Access" de la Palette le composant DataSource:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez ClientDataSet1

slectionnez dans la page "Data Controls" de la Palette le composant dbGrid:

Posez-le sur la tForm.


dans sa proprit DataSource slectionnez DataSource1

posez un tButton sur la Forme et faites lui charger (et ouvrir) ClientDataset1:
ClientDataset1.LoadFromFile('RESU.XML');Open;
pour pouvoir sauvegarder vos modifications, posez un tButton sur la Forme et
faites lui sauvegarder le contenu actuel de tClientDataset:
ClientDataset1.SaveToFile('RESU.XML');
compilez et excutez. Cliquez "load_cds_"
la dbGrid affiche le contenu de la table
titre d'exercice, ajoutez une nouvelle formation (7, SQL Oracle, 3, 1400):

sauvegardez le Cds avec ses modification en cliquant "save_cds_", puis quittez


cette application
8.4 - Mise jour du Serveur

Pour mettre jour le Serveur, nous utilisons


simplement cds.ApplyUpdates ("effectuez les mises jour"):
crez une nouvelle application et nommez-la "p_oracle_dbx_update_server"
placez un tSqlConnection sur la Forme

Cliquez deux fois sur SqlConnection1, renseignez "Driver Name"


(ORACLE), "DataBase" (ORCL), "User Name" (SCOTT)et "Pass Word"
(TIGER).
dans l'Inspecteur d'Objet, basculez LoginPrompt sur False, et vrifiez la
connection en basculant SqlConnection1.Connected sur True, puis fermez
la connection.
crez l'vnement OnAfterConnect, et placez-y l'instruction
SqlConnection1.ExecuteDirect(
'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=''.,''');

slectionnez dans la page "dbExpress" de la Palette le composant SqlQuery et


posez-le sur la tForm.

Slectionnez sa proprit SqlConnection et initialisez-la


SqlConnection1
slectionnez sa proprit SQL, cliquez sur l'ellipse ... pour ouvrir l'diteur
de chanes de caractres et tapez-y la requte:
SELECT * FROM FORMATIONS
cliquez sur "OK" pour ferme l'diteur

slectionnez dans la page "Data Access" de la Palette le


composant DatasetProvider:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez SqlQuery1

slectionnez dans la page "Data Access" de la Palette le


composant ClientDataSet:

Posez-le sur la tForm.


dans sa proprit ProviderName slectionnez DatasetProvider1

slectionnez dans la page "Data Access" de la Palette le composant DataSource:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez ClientDataSet1
slectionnez dans la page "Data Controls" de la Palette le composant dbGrid:

Posez-le sur la tForm.


dans sa proprit DataSource slectionnez DataSource1

posez un tButton sur la Forme et faites lui charger ClientDataset1:


ClientDataset1.LoadFromFile('RESU.XML');
posez un tButton sur la Forme et faites lui mettre jour le Serveur Oracle:
ClientDataset1.ApplyUpdates(-1);
compilez et excutez. Ouvrez le tClientDataSet et sauvegardez son contenu
le tClientDataset sauvegarde les donnes sur le Serveur: si vous chargez
l'application qui affiche simplement le contenu de FORMATIONS, vous verrez
bien la nouvelle ligne 7

Notez que:

l'vnement SqlConnection1.OnAfterConnect est destin faire


accepter les dcimales franaises. Si vous ne placez pas cette
instruction, vous aurez une exception "ORA-01722" (erreur de
conversion d'une chane numrique, pour des raisons de conflit "," et
"." par exemple)
nous avons plac dans SqlQuery la requte SELECT . En effet le
.XML ne contient pas le nom de la table
le nom de la table est "FORMATIONS" et non pas "formations". Il
s'avre que dbExpress passe les noms de tables en majuscules, et
donc si nous utilisons "formations", le Serveur provoquera une
exception "table pas trouve"

9 - Modification de Donnes
9.1 - UPDATE

L'instruction SQL de base pour modifier une donne est UPDATE.


UPDATE formations
SET f_prix= 1450
WHERE f_numero= 3

Comme cette instruction modifie des donnes du Serveur, nous utiliserons


un tSqlQuery et appellerons ExecSql.
crez une nouvelle application et appelez-la "p_oracle_dbx_update_data.dpr"
placez un tSqlConnection sur la Forme

Cliquez deux fois sur SqlConnection1, renseignez "Driver Name"


(ORACLE), "DataBase" (ORCL), "User Name" (SCOTT)et "Pass Word"
(TIGER).
dans l'Inspecteur d'Objet, basculez LoginPrompt sur False, et vrifiez la
connection en basculant SqlConnection1.Connected sur True, puis fermez
la connection.

slectionnez dans la page "dbExpress" de la Palette le composant SqlQuery et


posez-le sur la tForm.

Slectionnez sa proprit SqlConnection et initialisez-la


SqlConnection1

placez un tButton sur la Forme et crez sa mthode OnClick. Placez-y les


instructions de modification (changement de "Oracle" en "ORACLE":

procedure TForm1.update_Click(Sender: TObject);


begin
with SqlQuery1 do
begin
Close;

with Sql do
begin
Clear;
Add('UPDATE formations');
Add(' SET f_nom= '+ QuotedStr('ORACLE Delphi'));
Add(' WHERE f_numero= 3');
end;

Try
ExecSql;
except
on e: Exception do
display(' *** pb_insert '+ e.Message);
end;
end; // with SqlQuery1
end; // update_Click

compilez, excutez, et cliquez le bouton

Vous pouvez tlcharger le sources du projet "oracle_dbx_update_data.zip".


9.2 - Principe de Modification Interactive

Pour modifier les donnes en utilisant le tClientDataset, l'utilisateur va


travailler en deux tapes:

toutes les modifications (ajout, changement, effacement) sont


mmoriss par le tClientDataSet
lorsqu'il le souhaite, l'utilisateur peut envoyer les modifications vers
le Serveur Interbase

L'utilisateur travaille donc dans un premier temps uniquement avec la


mmoire du tClientDataSet. Celui-ci garde la trace intgrale de toutes les
modifications:

si nous modifions un enregistrement, nous aurons 6 fois


l'enregistrement en mmoire (l'original et les 5 modifications)
les ajouts sont placs dans la mmoire
les effacements sont mmoriss comme une nouvelle ligne avec une
marque d'effacement.

9.3 - Les Modifications de tClientDataset

Le tClientDataset contient donc une suite de lignes numrotes:

les lignes charges lors de l'ouverture de tClientDataset


les lignes ajoutes
les versions modifies de lignes prcdentes
les lignes effaces

Le dbGrid ne prsente quant lui que la dernire version de chaque ligne.

Pour visualiser les lignes originales et leurs versions successives, nous


allons simplement sauvegarder le tClientDataset dans un fichier .XML et
rafficher ce fichier .XML. Ce type d'analyse a t prsent dans
l'article Affichage ClientDataset XML. Nous nous contenterons ici d'appeler
les classes d'analyse et d'affichage.

Par consquent:
crez une nouvelle application et appelez-la "p_oracle_dbx_modify_cds.dpr"
placez un tSqlConnection sur la Forme

Cliquez deux fois sur SqlConnection1, renseignez "Driver Name"


(ORACLE), "DataBase" (ORCL), "User Name" (SCOTT)et "Pass Word"
(TIGER).
dans l'Inspecteur d'Objet, basculez LoginPrompt sur False, et vrifiez la
connection en basculant SqlConnection1.Connected sur True, puis fermez
la connection.
crez l'vnement OnAfterConnect, et placez-y l'instruction
SqlConnection1.ExecuteDirect(
'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=''.,''');

slectionnez dans la page "dbExpress" de la Palette le composant SqlQuery et


posez-le sur la tForm.

Slectionnez sa proprit SqlConnection et initialisez-la


SqlConnection1
slectionnez sa proprit SQL, cliquez sur l'ellipse ... pour ouvrir l'diteur
de chanes de caractres et tapez-y la requte:
SELECT * FROM FORMATIONS
cliquez sur "OK" pour ferme l'diteur

slectionnez dans la page "Data Access" de la Palette le


composant DatasetProvider:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez SqlQuery1

slectionnez dans la page "Data Access" de la Palette le


composant ClientDataSet:

Posez-le sur la tForm.


dans sa proprit ProviderName slectionnez DatasetProvider1

slectionnez dans la page "Data Access" de la Palette le composant DataSource:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez ClientDataSet1

slectionnez dans la page "Data Controls" de la Palette le composant dbGrid:

Posez-le sur la tForm.


dans sa proprit DataSource slectionnez DataSource1

posez un tButton sur la Forme et faites lui ouvrir ClientDataset1:


ClientDataset1.Open;
ajoutez un tButton pour afficher le contenu actuel du ClientDataset1 (optionnel):
ajoutez u_c_cds_analyze_xml et u_cds_table la liste des USES
posez un tButton sur la Forme et tapez le code d'affichage:

procedure TForm1.display_xml_Click(Sender: TObject);


var l_c_table: c_table;
begin
// -- save the CDS with some temporary name
ClientDataset1.SaveToFile(k_root_path+ 'temp.xml');

// -- reload the CDS and display it


with c_cds_analyze_xml.create_cds_analyze_xml('xml',
k_root_path+ 'temp.xml') do
begin
l_c_table:= c_table.create_table('table');
analyze_xml(l_c_table);

display_line;
l_c_table.display_formatted_line_list;
l_c_table.Free;
Free;
end; // with c_analyze_xml
end; // display_xml_Click

posez un tButton sur la Forme et faites lui mettre jour le Serveur:


ClientDataset1.ApplyUpdates(-1);
posez un tButton sur la Forme et faites lui mettre jour le Serveur:
ClientDataset1.Close;
compilez et excutez

A prsent voici un exemple de manipulation:

cliquez sur le bouton "open_cds_"

l'application ouvre la table et l'affiche

changez "ORACLE Delphi" en ORACLE DELPHI"


descendez verticalement sur la ligne suivante (pour forcer le transfert
du dbGrid vers le ClientDataset = POST)
cliquez "display_xml_" pour visualiser la modification:
La ligne 3 est bien inchange, mais le ClientDataset comporte une ligne
supplmentaire spcifiant quelles modifications ont t apportes la ligne 3
envoyez les modifications vers les Serveur en cliquant "ApplyUpdates_"
verifiez la modification en fermant le ClientDataSet ("close_cds_") puis en le
rechargeant ("open_cds_")

9.4 - Rconciliation de Donnes

Si deux agences de voyages essayent simultanment de rserver sur le mme


vol plus de place qu'il n'en reste, la grogne l'enregistrement est garantie. Il
faut donc trouver un moyen d'arbitrer entre les requtes incompatibles.

Nous n'allons pas rentrer ici dans le dtail des mode de transaction et des
verrouillages. Mais voici comment fonctionne une faon de traiter le
problme:

Oracle (comme les autres


moteurs: Interbase, Sql Serveur, DB2, MySql etc) fonctionne en mode
"optimiste": plusieurs utilisateurs peuvent charger une ligne, et la
modifier. C'est le dernier qui a parl qui a raison
nous pouvons demander dbExpress de vrifier avant de mette jour
que les valeur actuellement sur le Serveur sont bien les mmes que
celles que nous avons charges 10 minutes plus tt (en franais clair:
un autre utilisateur a-t-il effectu des modifications depuis notre
chargement ?). Cela se fait simplement en ajoutant UPDATE une
clause WHERE qui vrifie que la valeur est celle que nous avons
charge avant nos modifications). Pour faire simple, cette clause
pourrait tre:

UPDATE formations
SET f_nom= 'ORACLE DELPHI
WHERE (f_numero= 3) AND (f_nom= 'ORACLE Delphi')

si UPDATE choue (parce que WHERE ne trouve plus nos valeurs


initiale), dbExpress provoque une exception nous indiquant qu'un
autre utilisateur a modifi les donnes
notre application a alors la main. Nous pouvons dcider de forcer
un UPDATE (crasant la valeur des autres utilisateurs), ignorer
l'erreur, envoyer un message l'utilisateur en lui demandant de
recommencer en partant des nouvelles valeurs actuellement sur
le Serveur etc
pour faciliter la gestion de ces exceptions, dbExpress nous propose un
dialogue par dfaut affichant le conflit de rsolution et permettant
l'utilisateur de choisir le type de traitement effectuer (ignorer,
craser etc)

Voyons plus en dtail comment grer les erreur de rconciliation. Il faut tout
d'abord crer l'vnement OnReconcileError du tClientDataset. Les
paramtres sont les suivants:
PROCEDURE ReconcileError(
p_c_data_set: TCustomClientDataSet;
p_c_error: EReconcileError;
p_update_kind: TUpdateKind;
VAR pv_action: TReconcileAction);

et:

p_c_data_set: c'est le tClientDataSet qui contient les erreurs


p_c_error: une exception contenant dans p_c_error.Message le texte
de l'exception
p_update_kind indique si l'erreur provenant d'un ajout (ukInsert),
d'une modification (ukModify) ou d'un effacement (ukDelete)
pv_action: indique ce qu'il faut faire de cette erreur (annuler, forcer la
valeur etc)
Et Borland suggre mme d'utiliser un dialogue tout prparer pour proposer
l'utilisateur de dcider ce qu'il faut faire en lui prsentant directement le
problme et le le laissant choisir le traitement effectuer. Ce dialogue
appel RECERROR.PAS se trouve dans:

C:\PROGRAM FILES\BORLAND\DELPHI6\OBJREPOS

et a l'allure suivante:

et:

il affiche l'erreur
prsente les donnes ayant caus la faute
laisse l'utilisateur dcider ce qu'il souhaite faire

Pour utiliser ce dialogue:

il faut crer l'vnement tClientDataset.OnReconcileError


ouvrir le dialogue RecError et rcuprer le choix de l'utilisateur en
appelant HandleReconcileError en retournant cette valeur
dans pv_action:

pv_action:= HandleReconcileError(p_c_data_set, p_update_kind,


p_c_error);

Finalement pour comprendre les commandes que Delphi gnre pour nous
lors de l'appel de tClientDataset.ApplyUpdates, nous allons employer
unSqlMonitor qui affiche les API Interbase envoyes vers
le Serveur Interbase. Pour cela il suffit de

relier le tSqlMonitor tSqlConnection


basculer tSqlMonitor sur True
crer l'vnement tSqlMonitor.OnLogTrace et
visualiser tSqlMonitor.TraceList

Crons prsent l'application qui permet les modifications:


crez une nouvelle application et appelez-la "p_oracle_dbx_reconcile.dpr"
placez un tSqlConnection sur la Forme

Cliquez deux fois sur SqlConnection1, renseignez "Driver Name"


(ORACLE), "DataBase" (ORCL), "User Name" (SCOTT)et "Pass Word"
(TIGER).
dans l'Inspecteur d'Objet, basculez LoginPrompt sur False, et vrifiez la
connection en basculant SqlConnection1.Connected sur True, puis fermez
la connection.
crez l'vnement OnAfterConnect, et placez-y l'instruction
SqlConnection1.ExecuteDirect(
'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=''.,''');

slectionnez dans la page "dbExpress" de la Palette le composant SqlQuery et


posez-le sur la tForm.

Slectionnez sa proprit SqlConnection et initialisez-la SqlConnection1


slectionnez sa proprit SQL, cliquez sur l'ellipse ... pour ouvrir l'diteur
de chanes de caractres et tapez-y la requte:
SELECT * FROM FORMATIONS
cliquez sur "OK" pour ferme l'diteur

slectionnez dans la page "Data Access" de la Palette le


composant DatasetProvider:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez SqlQuery1
dans sa proprit UpdateMode, slectionnez UpWhereAll (ne mettre jour
que si la ligne est exactement celle que nous avons initialement charge)

slectionnez dans la page "Data Access" de la Palette le


composant ClientDataSet:

Posez-le sur la tForm.


dans sa proprit ProviderName slectionnez DatasetProvider1
slectionnez dans la page "Data Access" de la Palette le composant DataSource:

Posez-le sur la tForm.


dans sa proprit DataSet slectionnez ClientDataSet1

slectionnez dans la page "Data Controls" de la Palette le composant dbGrid:

Posez-le sur la tForm.


dans sa proprit DataSource slectionnez DataSource1

posez un tButton sur la Forme et faites lui ouvrir ClientDataset1:


ClientDataset1.Open;
posez un tButton sur la Forme et faites lui mettre jour le Serveur:
ClientDataset1.ApplyUpdates(-1);
ajoutez la liste des USES la forme de rconciliation:

USES .... recerror, ...


crez le gestionnaire d'erreur:

slectionnez ClientDataset1
crez son vnement OnReconcileError
appelez la Forme de rconciliation et retournez le code Delphi:

procedure TForm1.ClientDataSet1ReconcileError(
DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
display('reconcile '+ e.Message);
action:= HandleReconcileError(DataSet, UpdateKind, e);
end; // ClientDataSet1ReconcileError

ajoutez la trace Sql:

slectionnez dans la page "dbExpress" de la Palette le


composant SqlMonitor:

Posez-le sur la tForm.


slectionnez SqlConnection et mettez-y SqlConnection1
slectionnez Active et basculez le sur True
crez son vnement OnLogTrace et affichez les textes:

var g_trace_count: Integer= 0;

procedure TForm1.SQLMonitor1LogTrace(Sender: TObject;


CBInfo: pSQLTRACEDesc);
var l_length: Integer;
l_text: String;
begin
with CBinfo^ do
begin
l_length:= uTotalMsgLen;
if l_length> 0
then begin
SetLength(l_text, l_length);
Move( psztrace, l_text[1], l_length);
display(l_text);
end;
end;

with SQLMonitor1, TraceList do


while g_trace_count< Count do
begin
display(Strings[g_trace_count]);
Inc(g_trace_count);
end;
end; // SQLMonitor1LogTrace

compilez et excutez

Et pour vrifier le fonctionnement:


lancez l'excution, cliquez sur "open_cds_"

nous chargeons la table, et, entre autre "3, ORACLE DELPHI"


pour simuler un autre utilisateur, allez dans un explorateur Windows et lancez
une seconde instance de p_oracle_dbx_reconcile_cds.exe.

cliquez sur "open_cds_"


modifiez "3, ORACLE DELPHI" en "3, ORACLE et delphi"
descendez verticalement pour poster
mettez jour le Serveur en cliquant "ApplyUpdates_"
fermez cette application

retournez dans la premire instance

Modifiez "3, ORACLE DELPHI" en "bdd oracle delphi"


descendez verticalement pour poster
cliquez "ApplyUpdates_"

Delphi affiche une exception:

cliquez "OK" pour fermer le dialogue, puis "Run" dans le menu Delphi
Delphi affiche le dialogue de rconciliation

choisissez une des options, par exemple "correct" et cliquez "ok"

Delphi raffiche la dbGrid, et nous laisse modifier / mettre jour etc


10 - Et Maintenant ...
Dans ce premier article, nous n'avons pas prsent:

la gestion de Serveur (sauvegarde / restauration, les diffrents


modles Oracle ...)
le dtail des types de donnes
le dtail de traitement de tClientDataset
procdures stockes, les triggers, les squeces
traitement dtaill de la rconciliation
la gestion des transactions, les modes de transisolation
l'dition d'tats
la gestion des erreurs

De plus:

nous proposons des stages de formations pour les personnes qui


souhaiteraient approfondir ce qui a t prsent ici. Le but est de
rendre les stagiaires rapidement oprationnels et de rpondre aux
questions qu'ils auraient pu se poser au cours de premiers contacts
avec le dveloppement d'applications Oracle.
et nous avons aussi compil une liste de liens Oracle destine tout
particulirement aux dvelopeurs.

11 - Tlcharger le code source


Vous pouvez tlcharger:

oracle_dbx_connect.zip : la connection Oracle (14 K)


oracle_dbx_create_table.zip : cr des tables, avec des index (15 K)
oracle_dbx_insert_data.zip : insre des donnes (15 K)
oracle_dbx_read_data.zip : relit et affiche les donnes (15 K)
oracle_dbx_save_cds.zip : sauvegarde les donnes en local (15 K)
oracle_dbx_briefcase.zip : travail en mode dconnect (16 K)
oracle_dbx_update_server.zip : mise jour du Serveur partir des
donnes locales (17 K)
oracle_dbx_update_data.zip : instruction UPDATE (14 K)
oracle_dbx_modify_cds.zip : modification du Serveur partir d'un
dbGrid (15 K)
oracle_dbx_reconcile_cds.zip : rconciliation de plusieurs utilisateurs
(17 K)
Ce .ZIP qui comprend:

le .DPR, la forme principale, les formes annexes eventuelles


les fichiers de paramtres (le schma et le batch de cration)
dans chaque .ZIP, toutes les librairies ncessaires chaque projet
(chaque .ZIP est autonaume)

Ces .ZIP, pour les projets en Delphi 6, contiennent des chemins RELATIFS.
Par consquent:

crez un rpertoire n'importe o sur votre machine


placez le .ZIP dans ce rpertoire
dzippez et les sous-rpertoires ncessaires seront crs
compilez et excutez

Ces .ZIP ne modifient pas votre PC (pas de changement de la Base de


Registre, de DLL ou autre). Pour supprimer le projet, effacez le rpertoire.

La notation utilise est la notation alsacienne qui consiste prfixer les


identificateurs par la zone de
compilation: K_onstant, T_ype, G_lobal,L_ocal, P_arametre, F_unction, C
_lasse. Elle est prsente plus en dtail dans l'article La Notation Alsacienne