Les niveaux de correctif pour Database level 5 (7.2) et 34 (7.1) de IBM i apportent à SQL l'intégration du langage
JSON.
JSON (JavaScript Object Notation) est un format de données textuelles dérivé de la notation des objets du langage JavaScript (Wikipedia) |
ce qui s'écrit comme cela en XML | s'écrit comme cela en JSON | |
<producteurs> <producteur> <numero>45</numero> <commune>Reims</commune> <appellation>13</appellation> </producteur> </producteurs> |
-> | { |
D'ailleurs vous trouverez ici deux fonctions bien pratiques XML2JSON et JSON2XML écrites en Java.
Un élément peut contenir un objet, une valeur ou un tableau de valeurs, marqué alors par [ et ]
<PO> <id>103</id> |
devient (remarquez le tableau de "item")
{ "PO":{ "id": 103, "orderDate": "2014-06-20", "customer": {"@cid": 888}, "items": { "item": [ { "partNum": "872-AA", "productName": "Lawnmower", "quantity": 1, "USPrice": 749.99, "shipDate": "2014-06-21" }, { "partNum": "837-CM", "productName": "Digital Camera", "quantity": 2, "USPrice": 199.99, "comment": "2014-06-22" } ] } } } |
résumé des caractères spéciaux
Il y a trois manières d'utiliser JSON sur IBM i :
Pour un accès RPG, voyez le projet YAJL
Pour l'accès en ligne de commandes, sous QSH, lancez /QIBM/ProdData/OS/SQLLIB/bin/db2nosql.
la première fois utilisez impérativement l'option -setup enable
Comme souvent, ce produit a des difficultés avec les codes pages "Latins"....
cela créé une table SYSJSON_INDEX et (s'il le faut) ré-enregistre les fonctions JSON/SQL dans SYSTOOLS
Pour accéder en mode commande, vous pouvez lancer QSH ou bien copier les fichiers suivants depuis /QIBM/ProdData/OS/SQLLIB/bin
sur votre poste :
Pour lancer
sous QSH
depuis un PC
Attention tous les ordres sont sensibles à la casse.
db.sqlUpdate
passe un ordre SQL (par exemple create schema)
use schema
défini le schéma (bibliothèque) en cours
Cette dernière n'a pas forcement été créée par db2nosql
db.createCollection
créé une collection JSON (soit une table dans le schéma en cours)
cette table a la structure suivante
db.collection.insert
insert des données JSON dans une collection
C'est un BLOB (binaire) au format BSON
la fonction BSON2JSON est là pour afficher au format JSON (CLOB)
![]()
en 5250 il faudra ajouter CAST(systools.bson2json(data) as char(128) ) .....
sinon, vous verrez
Comme avec XML, la conformité du format JSON est vérifiée
de nombreuses commandes sont disponibles ensuite
Liste des commandes :
-- Commandes générales
Entrez 'help <méthode>' pour des informations détaillées. debug disable enable help use show
Syntaxe : "<method>"
-- Commandes de base de données
Entrez 'help db <méthode>' pour des informations détaillées.
createCollection dropAllCollections dropDatabase
getCollectionNames help
sqlQuery sqlUpdate stats
Syntaxe : "db.<method> "
-- Commandes des collections
Entrez 'help collection <méthode>' pour des informations détaillées.
aggregate count
distinct drop
ensureIndex exportFile find
findAndModify findOne help group importFile
insert markType remove
rename sampleSchema save
stats update
Syntaxe : db."collection".<méthode>
-- Commandes des curseurs
Entrez 'help cursor <méthode>' pour des informations détaillées.
batchSize help lazyFetch
limit size skip
sort
Syntaxe : "db.collection.find().<method> "
Exemples de commande : db.friends.insert({name:"Joe", age:5})
[Insérer dans la collection '"friends"'.]
db.friends.remove()
[Supprimer toutes les lignes de la collection '"friends"'.]
db.friends.find({name:"Joe"})
[Trouver des amis dont le nom est '"Joe"'.]
db.friends.find({age:{$gt:5}})
[Trouver des amis dont l'age est supérieur à "5".]
db.friends.find().sort({name:1})
[Trier par nom, par ordre croissant.]
db.friends.find().sort({name:-1}).limit(5)
[Trier par nom, par ordre décroissant, renvoyer les "5" premières lignes]
db.friends.find().sort({name:-1}).limit(5).skip(10)
[Trier par nom, par ordre décroissant, renvoyer les "5" premières lignes ignorer les "10" premières lignes.]
db.friends.importFile("C:\\myfriends.js")
[Importation de masse dans la collection]
quit
[Quitter l'interpréteur de commandes.]Pour plus d'informations, voir ce document (destiné à l'origine à DB2 sur autres plate-forme)
https://www.ibm.com/developerworks/data/library/techarticle/dm-1306nosqlforjson2/
Pour l'accès en java, voyez cette page https://www.ibm.com/developerworks/data/library/techarticle/dm-1307nosqlforjson3/
Pour se connecter
String url = "jdbc:as400://MONIBMi";
Connection con = DriverManager.getConnection(url, userid, password);
DB db = NoSQLClient.getDB(con, schema)
L'objet DB permet de passer des ordres SQL
db.SQLUpdate("CREATE SCHEMA JSONBIB");
L'objet DBCollection donnes accès à une collection au sens JSON
DBCollection jcol = db.getCollection("JSONCOL");
col.insert("{'nom':'Chateau Margaux','appellation':'Bordeaux', 'commune' : 'MARGAUX'}" )L'objet DBBasicObject offre un niveau d'abstraction avec un flux JSON
BasicDBObject json = new BasicDBObject();
json.append("nom","Coteaux de cherry");
json.append("appellation","Condrieu"); json.append("commune","Chavanay");
col.insert (json);
Pour l'accès en SQL, il faudra utiliser les fonctions SQL fournies
Vous pouvez très bien créer une table sous SQL avec un champs BLOB ou VARCHAR et mettre du JSON dedans ( JSON2BSON impératif si c'est un BLOB)CREATE TABLE JSONTXT( DATA VARCHAR(5000)) ; |
Exemple
values systools.BSON_VALIDATE(systools.JSON2BSON('{ |
Vous pouvez aussi utiliser les fonctions suivantes :
les différents type admis en 3eme argument
type demandé | type retourné | commentaire |
---|---|---|
'n' | DECFLOAT(34) | |
'i' | INTEGER | |
'l' | BIGINT | |
'f' | DOUBLE | |
'd' | DATE | |
'ts' | TIMESTAMP | |
't' | TIME | |
's:n' | VARCHAR (n) | n indique le nbr d'octets retournés (NULL si la longueur est supérieure à n). |
'b:n' | VARCHAR(n) FOR BIT DATA | n indique le nbr d'octets retournés (NULL si la longueur est supérieure à n). |
'u' | INTEGER / 4 | retourne 0 pour les éléments JSON vides, 1 si la valeur est fixée, NULL si l'élément n'est pas trouvé |
L'option na (No array) peut être ajoutée
Type |
Description |
1 |
un chiffre |
2 |
Chaîne |
3 | Objet |
4 |
Tableau (array) |
8 |
Booléen |
10 |
Null |
16 |
Integer (binaire) |
Exemple
CREATE TABLE POSAMPLE.JSONPO( ID INTEGER NOT NULL as identity, DATA BLOB(16M) DATCRT TIMESTAMP FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP ) ; |
INSERT INTO POSAMPLE.JSONPO (data) VALUES ( systools.JSON2BSON('{ |
select json_val(data , 'PO.customer.@cid' , 'f') from posample.JSONPO; |
select json_len(data , 'PO.items.item') from posample.JSONPO; |
On a alors la chaine entière au format BSON
select json_binary(data , 'PO.items.item' , 256) from posample.JSONPO; |
select json_type(data , 'PO.@id' , 5) from posample.JSONPO; |
Enfin il y a deux autres fonctions, non documentées à ce jour
rappelez vous, c'est en technology preview ...
les Technology Refresh 1 (7.3) et 5 (7.2) intégrent une version officelle de JSON_TABLE PLUS COMPLETE
Voyez notre comparatif XMLTABLE vs JSON_TABLE
Enfin la TR3 apporte de nouvelles fonctions
VALUES(JSON_ARRAY((SELECT DEPTNO FROM DEPT SELECT JSON_OBJECT('Nom' : LASTNAME, |
SELECT workdept, JSON_ARRAYAGG(lastname)
SELECT JSON_OBJECTAGG(workdept, JSON_OBJECTAGG(char(empno) value lastname)
options ------- •ABSENT on NULL (dft) •NULL on NULL •FORMAT JSON | BSON Indique que la data est déjà formatée : évite dans le cas de SELECT imbriqués (clause WITH) -les caractères d'échappement \ devant { et [ -les " autours des mots true et false •Order BY .... tri la donnée lors de l'agrégation •RETURNING CLOB(2G) CCSID 1208 (dft) •RETURNING CHAR/VARCHAR...ENCODING UTF-8 | UTF16 •RETURNING CHAR/VARCHAR...CCSID xxx •RETURNING BLOB •WITH UNIQUE KEYS (SQLCODE -16400/SQLSTATE 22030 en cas de clé en double dans le JSON) •WITHOUT UNIQUE KEYS (clé en double admises, depuis SF99702/level 23,SF99703/level 11) |