Académique Documents
Professionnel Documents
Culture Documents
1 - Introduction
Nous allons dtailler ici comment crer une base de donne Oracle 10g.
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.
1 - Cration de la Base
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
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:
Nous devons prsent crer un Service Windows qui grera notre instance.
Nous crons ce service en utilisant ORADIM.EXE.
Donc:
tapez la commande
tapez:
services.msc Entre
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:
db_name = the_base
db_block_size = 2048
control_files = C:\ORACLE\the_path\control01_the_sid.ora
c:\Oracle\the_path\the_init\init_the_sid.ora
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:
@? \the_script.txt Entre
Sous Sql/Plus
Par consquent:
lancez votre diteur prfr (NotePad, par exemple) et tapez le script suivant:
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:
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
La base cre est vide, et il faut excuter des scripts qui installent des tables
et programmes systmes dans la base:
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:
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)
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:
connect my_user/my_pass
@? \ODP.NET\samples\DataSet\RelationalData\Setup\demobld
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:
Nous avons plac ces textes ASCII dans un fichier .ZIP que vous pouvez
tlcharger:
1 - Introduction
Nous allons prsenter ici les tapes qui installeront le Serveur et
le Client Oracle 10G.
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
Avant de commencer
l'architecture gnrale
le tlchargement du serveur et du client
l'installation du Serveur
l'installation du Client
la programmation Oracle
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\
Nous avons aussi tlcharg le Client dont le lien est un peu plus bas:
Tlchargement en une petite heure.
L'ensemble fait 613 Megs, 2.103 fichiers dans 953 dossiers. Soit.
4.2 - Installation
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"
la connection
l'envoi de requtes SQL ou l'excution de scripts
des traitements d'administrations spcifiques
nous tapons n'importe quelle requte correspondant une table systme, pour
vrifier que tout fonctionne:
Nous dcomprimons le fichier .ZIP, ce qui nous fournit 377 Megs, 3093
fichiers dans 962 dossiers:
5.2 - Installation du Client Oracle
et nous confirmons
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.
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:
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:
Si vous utilisez une base dj installe, voici comment vrifier que vous
arrivez bien communiquer avec votre Serveur Oracle:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = pol-1400)(PORT =
1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
MY_NAME_RESOLUTION =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = pol-1400)(PORT =
1521))
)
(CONNECT_DATA =
(SERVICE_NAME= ORCL)
)
)
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):
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:
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:
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.
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.
Pour cela nous devons envoyer une requte en langage SQL vers
le Serveur Oracle.
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
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))');
Au niveau fonctionnement:
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
SqlConnection1
placez un tButton sur la Forme et crez sa mthode OnClick. Placez-y les
instructions de cration:
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
Donc:
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
Notez que:
Ajoutons deux autres tables notre exemple: une table pour les lieux des
formation, et une table pour les dates.
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:
Notre premire table n'tait pas dote d'une cl unique. Nous pouvons
corriger la dclaration par une instruction SQL ALTER .
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:
Voici une image de cette petite application lorsque nous avons cr les trois
tables:
6 - Ajout de Donnes
6.1 - Ajout simple
3, Oracle Delphi
De faon dtaille:
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
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
De plus si notre valeur est niche dans une String Pascal, il faut ddoubler
les guillemets simples
Pour les valeurs numriques avec dcimales, nous devons batailler avec les
points et les virgules:
3.1415
3,1415
FloatToStr
DecimalSeparator:= '.';
2004/03/29
'2004/03/29'
et:
Les valeurs insrer ont t figes dans notre code. Nous pouvons
gnraliser cet ajout
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
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
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
DecimalSeparator:= '.';
Add(' VALUES ('+ IntToStr(p_number)+ ... + FloatToStr(p_co
st)+ ')');
DecimalSeparator:= ',';
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.
Notez que pour lire les donnes nous avons utilis SqlQuery1.Open (alors
que pour crire des donnes, nous avons utilis tSqlQuery.ExecSql).
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).
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.
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
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)
8 - Le mode Nomade
8.1 - Principe
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
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
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):
Notez que:
9 - Modification de Donnes
9.1 - UPDATE
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
Par consquent:
crez une nouvelle application et appelez-la "p_oracle_dbx_modify_cds.dpr"
placez un tSqlConnection sur la Forme
display_line;
l_c_table.display_formatted_line_list;
l_c_table.Free;
Free;
end; // with c_analyze_xml
end; // display_xml_Click
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:
UPDATE formations
SET f_nom= 'ORACLE DELPHI
WHERE (f_numero= 3) AND (f_nom= 'ORACLE Delphi')
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:
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
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
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
compilez et excutez
cliquez "OK" pour fermer le dialogue, puis "Run" dans le menu Delphi
Delphi affiche le dialogue de rconciliation
De plus:
Ces .ZIP, pour les projets en Delphi 6, contiennent des chemins RELATIFS.
Par consquent: