pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #27
Client serveur, quel client ?
-
Le mode 5250 possède ses propres limites.
- le choix d'une architecture pérène est un véritable
défi :
- Client / serveur traditionnel
- le trio gagnant (dans la désordre) : VB , WINDEV, DELPHI (VisualAge RPG ?)
- N'est-il pas trop tard ? (gros problèmes de déploiement)
- Attention à limiter le rôle du client à la portion congrue
- le client WEB
- Scripts (NETDATA, PHP) ou JAVA (JSP/Servlets)
- Impossible de tout ré-écrire.
- rend primordiable le rôle du SGBD-R.
- Client / serveur traditionnel
Dans tous les cas de figure, vous devez CENTRALISER afin de CAPITALISER.
Réutilisation des routines GAP (4 si possible), par le jeux des procédures cataloguées, des fonctions.
Développement du rôle central de la base de données et du langage SQL.
Dans ce cadre nous vous proposons une petite histoire de la base de données AS/400 :
DDS et Historique de la base de données sur AS/400
fichiers physiques
######################## ## FICHIER PHYSIQUE ## ######################## |
######################## ## FICHIER PHYSIQUE ## ######################## |
######################## ## FICHIER PHYSIQUE ## ######################## |
######################## ## FICHIER PHYSIQUE ## ######################## |
######################## ## FICHIER PHYSIQUE ## ######################## |
######################## ## FICHIER PHYSIQUE ## ######################## MOTS-CLE COMPLEMENTAIRES. |
5) NOUVEAUTES V2R11
VARLEN variable à lg variable
|
######################## ## FICHIER PHYSIQUE ## ######################## |
|
fichiers logiques
|
|
|
|
REGARDONS MAINTENANT LE MEME EXEMPLE MAIS CETTE FOIS-CI AVEC UN DESSIN D'ENREGISTREMENT DIFFERENT DU FICHIER PHYSIQUE. |
|
|
|
|
|
3/ S D D --------- |
Exemple : Soit les fichiers physiques suivants : STGP1 (fichier stagiaires) | NOTP1 (fichier des notes) R STGF1 | R NOTF1 NUMSTG 6S 0 TEXT('N° stag') | NUMSTG 6S 0 TEXT('N° stag') NOMSTG 20 TEXT('Nom') | LANG 3 TEXT('langage') VILSTG 20 TEXT('Ville') | NOTE 4P 2 .. DEPSTG 2P 0 TEXT('départ') | Source : |
DB2/400 de la V3R10 à la V4R40
Rappel sur des fonctions de DB2/400 parfois sous-employées :
- Variables de Type DATE, HEURE, HORODATAGE
Remarques : ce n'est supporté QUE par le compilateur GAP 4 et SQL (Cobol depuis la V4R20)
- Notion de variable obligatoire/facultative (valeur NULL)
Remarques : le support de la valeur nulle est disponible pour GAP 4 depuis la .V3.7.
- Les vues
- On admet des vues portant sur des vues
- des calculs, des sélections complexes
- des vues de type traitement par groupe (group by)
Depuis la V3R10 :
1/ contraintes et intégrité référentielle.
- contrainte d'entité : Notion d'unicité
- intégrité référentielle une clé étrangère doit se rapporter à une clé primaire d'une table déclarée parente.
il est alors possible de préciser comment gérer
l'intégrité dans le sens parent/enfant.
C'est à dire que faire si l'on tente de supprimer un client ayant des
commandes.
les deux grandes hypothèses sont :
- action interdite.
- action répercutée en cascade.
- contraintes de domaine depuis la V4R20
quelques exemples
ADDPFCST FILE(CLIENT) TYPE(*PRIKEY) KEY(NOCLI) CST(client_unique)
ADDPFCST FILE(ENTCDE) TYPE(*REFCST) KEY(NOCLI) CST(client_existe) PRNFILE(CLIENT)
ADDPFCST FILE(ENTCDE) TYPE(*CHKCST) CST('commande_valide') CHKCST('nocde > 0 and datliv > datcde')
commandes et administration :
|
|
|
|
|
|
2/ SQL - DDL
DDL (Data Definition Language) est la partie de SQL permettant de concevoir sa base.
Aujourd'hui IBM préconise d'utiliser largement SQL , y compris pour
la création des fichiers.
D'ailleur nous verrons plus loin que les nouveautés base de données
ne sont maintenant disponibles que sous SQL
(images par exemple)
vous retrouverez alors un seul source et un seul langage pour la structure et les contraintes :
-- table des pays create table bdvin_00/pays ( pays char(20) , pays_code integer primary key ) ; -- table des régions create table bdvin_00/regions ( region char(30) , region_code integer primary key , pays_code integer references pays) ; -- table des appellations (Coteau du Layon, Côtes roties ...) create table bdvin_00/appellations ( appellation char(80) , region_code integer references regions , appel_code integer primary key ) ; |
Les tables sont automatiquement créées avec SIZE(*NOMAX) REUSEDLT(*YES)
et journalisées
(s'il existe un journal QSQJRN dans la bibliothèque)
LABEL ON permet de renseigner TEXT et COLHDG
ALTER TABLE propose de définir l'intégrité référentielle
sur une table existante.
manque aujourd'hui :
- EDTCDE / EDTWRD
- la notion de référence qui arrive en V5R20
3/ triggers
Triggers Associé à une action base de donnée
(on associe un pgm "maison" à l'action «insérer un client» ou «modifier un client» ou «supprimer un client».)
Remarques :
Certains SGBD associent le trigger à la colonne (si je modifie la quantité) DB2/400 reste orienté ligne (si je manipule un enregistrement)
depuis la V3R70 un trigger peut modifier l'enregistrement base de données qu'il a recu en tant que paramètre.
(mettre date du jour dans «date de création» à chaque ajout)
Les triggers peuvent être écrit dans n'importe quel
langage
C, RPG III ou IV ,COBOL
exemple :
ADDPFTRG FILE(ENTCDE) TRGTIME(*AFTER) TRGEVENT(*UPDATE) PGM(MONPGM) ALWREPCHG(*YES)
c'est le dernier paramètre qui autorise la mise à jour de l'enregistrement
le pgm MONPGM doir recevoir deux paramètres:
A/ un buffer contenant
- des infos systèmes (action BD, moment, ...)
- la version avant de l'enregistrement (s'il y a lieu)
- la version après de l'enregistrement (s'il y a lieu)
B/ la longueur du buffer
En V5R10, les triggers peuvent être écrits en PL/SQL ils peuvent être liés à une colonne (300 Triggers possibles par fichier) |
4/ jonction
DB2/400 admet maintenant la jonction norme SQL-92
C'est à dire SELECT * FROM CLIENT JOIN COMMANDE ON client.NOCLI = cde.NOCLI [WHERE ...]
Ce qui autorise les jointures externes :
(LEFT OUTER JOIN, c.a.d, tous les clients qu'ils possèdent ou non des commandes)
et les différences :
(EXCEPTION JOIN, c.a.d, les clients SANS commande))
V5R10 toujours, le RIGHT OUTER JOIN est admis |
5/ vues
Vues SQL
Il est maintenant possible de placer une vue SQL dans une bibliothèque OS/400.
Une vue avec sélection, peut demander à ce que le contrôle soit fait y compris pour les enregistrements ajoutés, par l'intermédiaire de la vue avec WITH CHECK OPTION
l'odre SELECT en V4R20 admet les tests (CASE)
Select cours, texte, case sitfam
when 'C' then 'célibataire'
when 'M' then 'marié'
when ...
end AS situation
from ficpers
ou
Select noart, qtecde, puart,
case
when codepays <> 'F' then puart
when dep = 97 then puart *1,09
else puart *1,206
end as TTC from cdecli
de telles requêtes peuvent être mémorisées dans une vue.
exemple
CREATE VIEW mabib.v1 AS
SELECT matricule, nom, prénom, salaire * 13 as annuel
CASE sitfam
when 'C' then 'célibataire'
when 'M' then 'marié'
when 'D' then 'divorcé'
when 'V' then 'veuf/veuve'
END AS situation
FROM ficpers WHERE datdep is null with check option
6/ DRDA
- Two PHASES COMMIT
Exemple :
connect to base 1
moins 100 dans la quantité pour le produit A1
connect to base 2
plus 100 dans la quantité pour le produit A1
Commit
la phase de validation sera réalisée en deux temps
:
- demande de préparation à la validation (prepared wave)
- validation effective (commited wave)
- V4R20, DDM/DRDA sur IP
(attention DRDA sur IP est en One phase commit, ce qui veut dire que vous devez valider avant de changer de sytème)
V5R10 : Two phases Commit sur IP |
- ODBC / JDBC
- Il est intégré pour les clients Windows:
- Il bénéficie de toutes les améliorations de SQL/400 (conformité aux standards), et est compatible DRDA :
ainsi un micro connecté à l'AS/400, reconnaît toutes les bases connues de l'AS/400 lui-même.
- Client acces depuis la V3R1M3 propose e support de OLE DB
c'est à dire ODBC en plus lèger, plus universel (accès
en mode ligne à ligne par exemple) et utilisé en tant que composant
ACTIVE X.
7/ Procédures cataloguées
Un ensemble d'actions base de données devant être réalisées sur une base distante peut être demandé par l'appel à une procédure (un programme) stockée sur le serveur distant.
Cela normalise un ordre CALL (en tant qu'ordre SQL), avec passage de paramètres et ce, en étant affranchi de l'OS du serveur.
Sur l'AS/400 les procédures cataloguées peuvent être écrites dans n'importe quel langage et leur déclaration est optionnelle.
- V4R20, on reconnait le PL/SQL pour l'écriture des
procédures cataloguées. HELAS, il faut le compilteur C/400.
V5R10 : le compilateur C n'est plus obligatoire
(pseudo-compilateur intégéré à SQL/400)
Create Procedure bib/p1
(in nomatin DEC(6, 0),
in newcoef DEC(3, 0),
out codert int)
language SQL
P1:
Begin
Declare coeflu DEC(3, 0);
Declare Exit handler for SQLExecption Set codert=SQLCODE;
Select coef from personp1 into coeflu where nomat = nomatin;
if newcoef > coeflu then
update personp1 set coef = newcoef
where nomat = nomatin;
end if;
End
Divers
Une procédure cataloguée invoquée par ODBC peut renvoyer explicitement un groupe d'enregistrement par :
- SET RESULT SETS CURSOR xxx (le curseur xxx, résultat d'une requête)
- SET RESULT SETS ARRAY yyy (la table[tableau] yyy, chargée comme bon vous semble)
Des outils de suivi et de contrôle de l'optimiseur de requêtes sont mis en place par la version 3.10 :
- PRTSQLINF : pour analyser les plans d'accès
- CHGQRYA : pour limiter les requêtes, et gérer le parallélisme
- STRDBMON et ENDDBMON pour analyser l'activité base de donnée (avec écriture dans un fichier)
- Visual Explain (V4R50) pour une analyse graphique
8/ Alter TABLE
L'ordre ALTER TABLE permet maintenant de modifier la structure d'une table dynamiquement :
- Modifier la notion de variable obligatoire/facultative
- Modifier une colonne (taille, type, précision)
- Ajouter, enlever une colonne.
Cela apporte aussi une nouvelle commande OS :
CHGPF qui comporte un paramètre SRCFILE qui permet une Recréation
CHGPF FILE(clients) SRCFILE(QDDSSRC) SRCMBR(clients)
ATTENTION : la recopie se fait sur les noms de zone, vous ne
pouvez donc
pas renommer des zones, mais les modifier, en ajouter
et modifier des paramètres comme EDTCDE, COLHDG, et, en règle générale, tout ce qui touche à :
- la jonction
- la définition du chemin d'accès
- les sélections / omissions.
Pour les conversions nous sommes limités aux possibilités de la commande CPYF.
tout format numérique <--> tout format numérique
numérique étendu --> caractère
numérique étendu <--> date au format *YMD, *DMY , *MDY --> date au format *ISO, *USA, *EUR
caractère <--> date *YMD, *DMY, ...
(idem) --> date *EUR, *USA, ...
caractère <--> timestamp (idem pour les formats)
date <--> date (changement de format transparent)
heure <--> heure
La valeur par défaut pour une date devient la date du jour, pour une heure cela devient l'heure en cours.
- De nouvelles fonctions , dont un certains nombre d'ALIAS, montrant la volonté du constructeur de rendre DB2/400 compatible avec les standards.
9/ SYNTAXE SQL, nouveautés et récapitulatif : (en Bleu, les nouveautés V5R10)
Fonctions de groupe
Fonction(x) | Retourne ? | Exemple |
AVG(x) | la moyenne de X pour un groupe de ligne | AVG(quantite) |
COUNT(*) | le nombre de lignes sélectionnées | |
COUNT(DISTINCT X) | le nombre de valeurs différentes pour X | COUNT(dictinct nocli) |
MAX(X) | retourne la plus grande valeur sélectionnée | MAX(DATLIV) |
MIN(X) | retourne la plus petite valeur sélectionnée | MIN(prix) |
SUM(x) | retourne la somme de X | SUM(qte * prix) |
VAR(X) | retourne la variance | |
STDDEV(X) | retourne l'écart type |
Fonctions ligne à ligne
Fonction(x) | Retourne ? | Exemple |
MAX(X,Y) | retourne la plus grande valeur de X ou de Y | MAX(prixHA, pritarif) * qte |
MIN(X,Y) | retourne la plus petite valeur de X ou de Y | MIN(datce, datliv) |
ABSVAL(x) | la valeur absolue de x | ABSVAL(prix) * qte |
CEIL(x) | Retourne l'entier immédiatement supérieur à X | CEIL(2,42) = 3 CEIL(2,56) = 3 |
RAND() | Retourne un nombre aléatoire | |
ROUND(x , y) | Retourne l'arrondi comptable à la précision y | ROUND(2,42 , 1) = 2,40 ROUND(2,56 , 1) = 2,60 |
SIGN(x) | Retourne -1 si x est négatif, 1 s'il est positif, 0 s'il est null | Where SIGN(x) = -1 |
TRUNCATE(x , y) | Retourne le chiffre immédiatement inférieur à X (à la précision y) | TRUNCATE(2,42 , 1) = 2,40 |
DEC(x , l, d) | x au format numérique packé avec la lg et la précision demandée. | DEC(zonebinaire) ) |
DIGITS(x) | x en tant que chaîne de caractères | DIGITS(datnum) |
CHAR(x) | x en tant que chaîne de car. (x étant une date) | CHAR(current date) |
FLOAT(x) | x au format "virgule flottante" | FLOAT(qte) |
INT(x) | x au format binaire | INT(codart) |
ZONED(x) | x au format numérique étendu | ZONED(prix) |
CAST(x as typeSQL[lg]) | x au format indiqué par typeSQL : types valides |
CAST(qte AS CHAR(9)) Attention les zéros de gauche sont éliminés CAST(prixchar as NUMERIC(7,
2)) cast('123456,89'
as numeric(7,
2)) |
STRIP(x) ou TRIM(x) RTRIM(x) LTRIM(x) |
supprime les blancs au deux extrémités de
x. les blancs de droite les blancs de gauche |
TRIM(raisoc) |
LENGTH(x) |
la longueur de x | LENGTH(nom) |
CONCAT(x , y) | concatene X et Y (aussi x CONCAT y ou X !! Y) | CONCAT(nom, prenom) |
SUBSTR(x, d, l) | extrait une partie de x depuis D sur L octets | SUBSTR(nom, 1, 10) |
LEFT(x, l) | extrait une partie de x depuis 1 sur L octets | LEFT(nom, 10) |
SPACE(n) | retourne n blancs | nom concat space(5) concat
prenom |
MOD(x, y) | le reste de la division de x par y | MOD(annee, 4) |
RRN(fichier) | N° de rang | RRN(clientp1) |
TRANSALTE(x) |
X en majuscule | WHERE |
LOWER(x) LCASE(x) |
x en minuscule (V4R40 uniquement) | WHERE |
TRANSLATE( x, remplace, origine) | Remplace tous les caractères de X présent dans origine par le caractère de même position dans remplace | TRANSLATE(prixc, ' F', '0$') |
SOUNDEX( x) | Retourne le SOUNDEX (représentation
phonétique) de X [basé sur un algorhytme anglo-saxon) |
Where SOUNDEX(prenom) = SOUNDEX('Henri') |
DIFFERENCE( x) | Retourtne l'écart entre deux
soundex [0 = très différents, 4 = trés proches] |
Where DIFFRENCE(prenom, 'HENRI)>
2 |
VALUE(x, y) IFNULL(x, y) |
retourne x s'il est non null, sinon y | IFNULL(DEPT, 0) |
LOCATE(x, y ,d) | retourne la position à laquelle x est présent dans y ou 0 (la recherche commence en D, qui est facultatif) | LOCATE(' ', raisoc) |
POSITION(x IN y) |
idem LOCATE | POSITION(' ' IN raisoc) |
NULLIF(x, y) | reourne NULL si X = Y | NULLIF(Prix, 0) |
CASE when ... then .. when ... then .. [else] END |
retourne la valeur du premier THEN ayant la clause WHEN de vérifiée. |
|
Fonctions liées aux dates
Fonction(x) | Retourne ? | Exemple |
DATE(x) X doit être une chaîne au format du JOB |
une date (sur laquelle les fonctions suivantes s'appliquent) | DATE( |
DAY(D) DAYOFMONTH(D) |
retourne la partie jour de D (doit être une date ou un écart AAAAMMJJ). |
DAY(DATCDE) |
MONTH(D) | retourne la partie mois de D (idem) |
|
YEAR(D) | Retourne la partie année de D (idem) | YEAR(current date - DATCDE) |
DAYOFYEAR(D) | retourne le n° de jour dans l'année (julien) | DAYOFYEAR(datdep) |
DAYOFWEEK(D) | retourne le N° de jour dans la semaine (1 = Dimanche, 2=Lundi, ...) |
DAYOFWEEK(ENTRELE) |
DAYOFWEEK_ISO(D) | retourne le N° de jour dans la semaine (1 = Lundi, ...) |
DAYOFWEEK_ISO(ENTRELE) |
DAYS(D) | retourne le nbr de jours depuis 01/01/0001 | DAYS(datcde)- DAYS(datliv) |
QUARTER(D) | retourne le n° du trimestre | QUARTER(DATEFIN) |
WEEK(D) | retourne le n° de semaine (Attention 01/01/xx donne toujours semaine 1) |
WHERE |
WEEK_ISO(D) | retourne le n° de semaine (la semaine 1 est celle qui possède un JEUDI dans l'année.) |
WHERE |
CURDATE() | retourne la date en cours, comme CURRENT DATE | |
CURTIME() | retourne l'heure en cours, comme CURRENT TIME | |
NOW() | retourne le timestamp en cours | |
JULIAN_DAYS(d) | retourne le nbr de jours qui épare une date du 1er Janv. 4712 av JC. | JULIAN_DAYS(datcde) |
Fonctions liées aux heures
Fonction(x) | Retourne ? | Exemple |
TIME(T) | une heure | TIME( |
HOUR(T) |
retourne la partie heure de T | HOUR(Pointage) |
MINUTE(D) | retourne la partie minute de T |
|
SECOND(T) | Retourne la partie secondes de T |
Fonctions liées aux Timestamp
Fonction(x) | Retourne ? | Exemple | ||||||||||
TIMESTAMP(T) | un timestamp (date - heure - microsecondes) | TIMESTAMP(' |
||||||||||
TIMESTAMP (D T) |
un timestamp (microsecondes à 0) | TIMESTAMP(datcde heure) |
||||||||||
TIMESTAMPDIFF (c 'DIFFERENCE') |
C indique l'unité de mesure de l'écart
que vous souhaitez obtenir
'DIFFERENCE' est la représentation
caractères [ CHAR(22) ] |
TIMLESTAMPDIFF(32 , CAST(CURRENT_TIMESTAMP - CAST(DATLIV AS TIMESTAMP) AS CHAR(22)) ) |
||||||||||
MIDNIGHT_SECONDS | retourne le nbr se secondes qui sépare un timestamp de minuit | MIDNIGHT_SECONDS(pointage) |
Nouveaux types de verrouillage sous contrôle de validation.
valeur | équivalent V3R10 | enregistrement(s) verrouillé(s) |
*NC | *NONE | aucun, commit/rollback inacif |
*UR | *CHG | tous les enreisgtrements modifiés |
*CS | *CS | identique à *CHG, plus UN enregistrement modifié par fichier lu |
*RS | *ALL | tous les enregistrements (même lus) |
*RR | (nouveau) | idem à *ALL plus ALCOBJ du fichier (la lecture doit pouvoir être reproduite à l'indentique) |
Cela peut s'indiquer maintenant sur le SELECT par la clause :
SELECT .... FROM ... WHERE .... WITH [RR!RS!CS!UR!NC] .
ainsi que sur les instructions :INSERT, UPDATE, DELETE.
10/ Options :
Les versions V3R20 / V3R70 ammènent à DB2 le parallèlisme :
l'utilisation de plusieurs processeurs pour un requête
"DB2 Symmetric Multiprocessing for OS/400" ou SMP
option (n° 26) de l'OS/400, facturable.
cette option se met en place par :
1/ la valeur système QQRYDEGREE
2/ qui donne la valeur par défaut pour la commande CHGQRYA DEGREE()
Le paramètre DEGREE qui autorisait déja le parallèlisme
d'E/S,
admet maintenant *MAX et *OPTIMIZE qui permettent de répartir la
requête sur plusieurs processeurs.
L'option 27 de l'OS/400 (toujours facturable)
"DB2 Multi System for OS/400"
permet elle de répartir un fichier sur plusieurs machines
le principe est le suivant :
création d'un nouvel objet *NODGRP
CRTNODGRP NODGRP(basemulti) RDB(S441234 S445678)
(s44s1234 et s445678 sont les noms DRDA attribués par ADDRDBDIRE)
puis
CRTPF FILE(clientp1) SRCFILE(QDDSSRC) NODGRP(basemulti) PTNKEY(NOCLI)
11/ Sécurité (V4R20):
- Sécurité (droits) à la colonne :
update(notel, adr1, adr2) :
on table personp1 :
to pdupont; :
ici on accorde le droit de lecture (toutes colonnes)
et le droit de modifier les colonnes N° de tel et adresses
à PDupont.
les commandes DSPOBJAUT et EDTOBJAUT montrerons les autorisations
de niveau zone, mais ne permetterons pas la modification.
les droits seront vérifiés aussi bien en SQL qu'en RPG/COBOL
- remote journaling
12/ V4R30:
- gestion des ALIAS
un ALIAS permet de renommer un fichier (lui donner un nom long)
ou préciser un membre pour un fichier multi-membres.
CREATE ALIAS MABIB/MBR2_ALIAS FOR MABIB/FIC1P1 (MBR2)
mettre à jour MBR2_ALIAS revient à mettre à jour MBR2 dans FIC1P1
- Sous sélection admise dans l'ordre UPDATE
la notion de sous-sélection permettait de mettre un ordre SELECT dans la clause WHERE d'un ordre SQL.
SUPPRIMER les clients sans commande : Delete from client C where not exists supprimer les commandes quand la clause SELECT ne trouve pas de ligne (NOT EXISTS) ayant le n° de client lu dans le fichier client (C.nocli) |
Cette synatxe est maintenant acceptée dans la clause SET de UPDATE
UPDATE command C set priha = (select pritarif from article WHERE codart = C.codart ) WHERE priha = 0 |
mettre à jour le fichier command, mettre dans priha la valeur retournée par la clause select qui dit
(je vais chercher le pritarif dans le fichier article, de la ligne ayant le code article lu dans le fichier commande )
- Les nouveaux Index EVI (Encoded Vector Index)
13/ V4R40:
- tables dérivées :
on peut indiquer un ordre SELECT dans la clause from d'un ordre SELECT
ou bien déclarer juste avant le SELECT une "vue temporaire" par WITH.
exemple , soit un fichier des cours, chaque cours est enregistré sous un module de cours.
je veux le nombre de cours du module qui en a le plus.
with temp as (select count(*) as nbr from Fmodules group by codmodul) select max(nbr) from temp |
- deux nouveaux types de données apparaissent en V4R40 (ptf SF99104)
les types de données LARGES (jusqu'à 15 Mo)
les DATALINK (ou URL)
a/ les LOB (Large Object)
ils sont de trois sortes
+ CLOB Chararcter Large Object, supportent la notion de CCSID
+ DBCLOB Double Byte CLOB, idem CLOB mais en DBCS
+ BLOB Binary Large Object, binaires, donc prévus pour les images la video, etc...
ex: CREATE TABLE VOITURE (image as BLOB 2M)
b/ les types de colonne DATA LINK
il s'agit de colonnes dont le contenu référence un fichier externe.
a/ le nom du fichier est donné sous forme d'URL
b/ le fichier reste à l'exterieur de la base de données (utilisable par votre serveur WEB, par exemple)
c/ le serveur Base de données peut vous fournir un contrôle de type: - je vérifie que le fichier existe lors de l'insertion
- je vérifie la présence du fichier tant qu'il est référencé dans la base.
vous devez lancer un serveur TCP/IP appelé DLFM
(DATA LINK FILE MANAGER), pour gérer ces contrôles temps réel.
ET ENFIN, orientation objets (toujours la group-ptf SF99104)
- les fonctions définies par l'utilisateur [UDF]
- les types de données définies par l'utilisateur [UDT]
une fonction est un programme ou une procédure dans un programme de service enregistré(e) dans les catalogues SQL par CREATE FUNCTION.
par exemple :
CREATE FUNCTION AF4TEST/DT8_CHAR8 (DEC(8 , 0) )
RETURNS CHAR(8)
EXTERNAL NAME 'AF4TEST/DT_SQL(DT8_CHAR8)'
(1)
PARAMETER STYLE GENERAL (2)
RETURNS NULL ON NULL INPUT ; (3)
(1) fait référence à DT8_CHAR8 dans DT_SQL (2) le passage de paramètres se fait sans gestion de la val. nulle (3) la fonction retourne nul si un des argument est nul (il n'y aura pas d'appel)
Vous pouvez aussi créer des fonctions à l'aide du PL/SQL à condition d'avoir le compilateur C avant la V5.
Et pour terminer les types de données définis par l'utilisateur
ils sont créés par :
CREATE DISTINCT TYPE IMAGE AS BLOB(512K)
CREATE DISTINCT TYPE EUROS AS DECIMAL(9, 2)
CREATE DISTINCT TYPE FRANCS AS DECIMAL(9, 2)
vous pouvez maintenant créer une table par
CREATE TABLE VOITURES
(CODE CHAR(10) NOT NULL PRIMARY KEY,
PRIXf FRANCS NOT NULL, PRIXe EUROS,
PHOTO IMAGE)
la particularité de ces types est qu'ils sont fortement typés
c'est à dire que l'on ne PEUT PAS COMPARER DES FRANCS et DES EUROS.
WHERE PRIXF > PRIXE est syntaxiquement invalide !!!
WHERE PRIXF > 10000 aussi !
seules des FONCTIONS supportant ces types sont habilitées à les manipuler.
on parle alors de SGBDR-OO (ou orienté objet)
le système assure une conversion avec le type d'origine, (CAST
ou le nom du type) ,
WHERE PRIXE > EUROS(10000) est admis.
ici, le plus simple serait donc d'écrire deux fonctions
une fonction de convertion francs/euros
une fonction de convertion euros/francs
create function af4test/franc_euros (VALEUR FRANCS) returns EUROS LANGUAGE SQL RETURNS NULL ON NULL INPUT STATIC DISPATCH BEGIN DECLARE VALEUROS DECIMAL ( 9 , 2 ) ; SET VALEUROS = CAST(VALEUR as decimal(9,2) ) / 6.55957; RETURN CAST(VALEUROS as euros); END; |
14/ V5R10:
- triggers, procédures cataloguées et fonctions peuvent être
écrits en PL/SQL sans autre produit que 5722ST1.
- triggers :
- 300 triggers par fichier.
- gestion des triggers (état *ENABLED / *DISBALED).
- trigger à la colonne (le pgm n'est lancé que si CETTE ZONE est modifiée).
- Condition complexe à l'exécution d'un trigger (clause
WHEN ayant le même syntaxe qu'un WHERE).
-- EXEMPLES DE TRIGGER -- -- SI PRXACTUEL < PRIX (D'ACHAT) LORS D'UNE MISE A JOUR -- IL PREND LA VALEUR DE PRIX. -- CREATE TRIGGER MAJ_PRIX BEFORE UPDATE OF CAV_PRXACTUEL ON BDVIN/CAVE REFERENCING NEW ROW AS NOUVEAU FOR EACH ROW MODE DB2ROW BEGIN IF NOUVEAU.CAV_PRXACTUEL < NOUVEAU.CAV_PRIX THEN SET NOUVEAU.CAV_PRXACTUEL = NOUVEAU.CAV_PRIX ; END IF; END ;
- Select admis dans la liste des colonnes
- Select codart , qte * prix as montant, (select sum(qte * prix) from commandes c2 where c2.famcod = c1.famcod) / (c1.QTE * c1.prix)
from commandes c1
- Select codart , qte * prix as montant, (select sum(qte * prix) from commandes c2 where c2.famcod = c1.famcod) / (c1.QTE * c1.prix)
- FETCH FIRST x ROWS ONLY
15/ V5R20: (nouvelle version disponible en Août 2002)
- Plusieurs instances de DB2 pourraient tourner en parallèle.
- même le produit 5722ST1 ne serait plus obligatoire pour créer
triggers et fonctions en PL/SQL.
- DEBUG possible au niveau SQL, pour les triggers, les fonctions et procédures
écrits en PL/SQL
- type de données "clé", automatiquement incrémenté
par DB2.
(pour un numérotation automatique des codes (clients/ commandes, etc...)
-
UNION, enfin accepté dans les vues SQL si un enregistrement peut se trouver soit dans un fichier (pointage) ,
soit dans un autre (absences), il est possible de demander : SELECT nopers, nom, 'Présent : (' concat digists(nbheures) concat ') Heures' as presence from person P join pointage H on p.nopers = H.nopers UNION SELECT nopers, nom, motif from person P join absences A on P.nopers = A.nopers ce select peut maintenant être mémorisé dans une vue.(create view SQL) - LIKE admis au niveau zone dans le CREATE TABLE
- nouveau gestionnaire de transaction
- meilleure compatibilité avec JDBC et la notion de thread en général.
- supervision des transactions sous Operation Navigator
- améliorations pour SMAPP et la fonction journal.
13/ enfin , au fur et à mesure des versions, la possibilité d'avoir
une administration graphique de la base de données via
Operation Navigator
permettant
- une mise à jour directe des tables (si journalisées)
- lancement et mémorisation de scripts SQL depuis le PC(même sans le produit 5722ST1)
- Intégrant bien sûr, les toutes dernières nouveautés
DB2/400: