Vous pouvez maintenant manipuler vos variables HOST (dans un pgm RPG ...) par un ordre SQL : SET :variable = expression ou bien VALUE expression INTO :variable par exemple C/EXEC SQL C+ SET :Result = LEFT(:NOM, 10) CONCAT :PRENOM C/END-EXEC C/EXEC SQL C+ VALUE POSSTR(:RAISOC , 'Assurance') INTO :debut C/END-EXEC |
de nouveaux types de données apparaissent en V4R40 (ptf SF99104) les types de données LARGES (jusqu'à 15 Mo) les DATALINK (ou URL) 1/ 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) |
> Une colonne de type LOB peut-être manipulée par -son contenu (si votre langage supporte des variables aussi grandes) vous devez déclarer en RPG par: DMYBLOB S SQLTYPE(BLOB:500) ce qui génère : D MYBLOB DS D MYBLOB_LEN 10U 0 D MYBLOB_DATA 500A L'exemple suivant montre comment utiliser les BLOB en JAVA: Blob img = resultSet.getBlob ; long lg = blob.length (); byte[] R = img.getBytes (0, (int) lg); |
Avec des produits comme VB ou autres (tests réalisés avec VB6) la gestion des images est transparente. Si vous utilisez un objet DATA Control nommé "data1" - définissez une image sur votre feuille (objet "image1") - renseignez les propriétés suivantes : image1.datasource = data1 image1.datafield = le nom du champ BLOB. VB reconnait l'image sur son contenu et traite aussi bien les GIF, JPG, BMP, ....(préférez GIF pour les temps de chargement) En programmation ODBC ou ADO utilisez LOADPICTURE( ) |
-vous pouvez utiliser un identifiant appelé "LOCATOR", qui permet : + de ne pas transférer les data dans le programme (donc sur le PC) + de faire des copies de fichiers ... vous devez déclarer en RPG par: D MYCLOB S SQLTYPE(CLOB_LOCATOR) ce qui génère : D MYCLOB S 10U 0 vous pouvez utiliser l'identifiant en lieu et place de la colonne par les nouvelles instructions SET et VALUE. C/EXEC SQL C+ VALUE POSSTR(:MYCLOB, 'formation') INTO :debut C/END-EXEC |
-vous pouvez utiliser un fichier appelé "FILE LOCATOR", qui permet : + de copier le contenu d'un LOB dans un fichier IFS + de renseigner un LOB à partir du contenu d'un fichier IFS. vous devez déclarer en RPG par: D MYFILE S SQLTYPE(CLOB_FILE) ce qui génère : D MYFILE DS D MYFILE_NL 10U 0 [lg du nom] D MYFILE_DL 10U 0 [lg des Data] D MYFILE_FO 10U 0 [file permission] * SQL génère SQFRD (2), SQFCRT (8), SQFOVR(16) et SQFAPP(32) D MYFILE_NAME 255A [nom du fichier] |
Exemple en COBOL en Working Storage Section : 01 rapport USAGE IS SQL TYPE IS CLOB-FILE puis en traitement move "RAPPORT.TXT" to rapport-NAME. move 11 to rapport-LENGTH. move SQL-FILE-OVERWRITE to rapport-FILE-OPTIONS. EXEC SQL SELECT rapport INTO :rapport FROM ... WHERE ... END-EXEC. ce traitement place copie du contenu de la colonne "rapport" dans le fichier "RAPPORT.TXT" qui est un fichier IFS. un ordre INSERT aurait renseigné la colonne par copie du fichier. |
Autre Grande nouveauté : les types de colonnes 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. la table doit être journalisée. |
DLFM doit être initialisé par INZDLFM (une fois par AS/400) >il s'agit d'un script, qui créé une base de donnée. Exécution en cours : create collection QDLFM. Exécution en cours : create table dfm_rcfile (dbid VARCHAR(8) FOR BIT D A NOT NULL,prfxid VARCHAR(8) FOR BIT DATA NOT NULL WITH DEFAULT,recov_i VARCHAR(6) FOR BIT DATA NOT NULL,rec_id INTEGER,stemname VARCHAR(128) T NULL WITH DEFAULT,grp_id_idx INTEGER,grp_genid VARCHAR(17) FOR BIT DATA N NULL WITH DEFAULT,pid INTEGER,status SMALLINT). .../... Exécution en cours : CREATE TABLE DFM_DIR (fsid VARCHAR(8) F BIT DATA NOT NULL,inode INTEGER NOT NULL,parent_inode I EGER,dir_name VARCHAR(240) NOT NULL,information VARCHAR(64 PRIMARY KEY(fsid, inode),FOREIGN KEY(fsid,parent_inode) REFERENCES dfm_dir DELETE CASCADE). Press ENTER to end terminal session. ===> F3=Exit F4=End of File F6=Print F9=Retrieve F17=Top F18=Bottom F19=Left F20=Right F21=User Window |
Exemple d'utilisation : CREATE TABLE AF400/AF4URLP1 (AF4MDL CHAR ( 10) NOT NULL, AF4MBR CHAR ( 10) NOT NULL, AF4URL DATALINK LINKTYPE URL FILE LINK CONTROL (1) INTEGRITY ALL READ PERMISSION FS (2) WRITE PERMISSION FS RECOVERY NO) (3) (1) : le contrôle d'exitence doit être fait. (sinon vous avez un contrôle de syntaxe uniquement, lors de l'INSERT) (2) les droits sont ceux du fichier dans IFS (les seules droits considérés pourraient être ceux de la colonne) (3) restauration de l'intégrité lors de restauration de la table (oui/non) |
Quelques remarques : Avec les droits DB2, tous les droits sont retirés sur le fichier stream lors d'un SELECT SQL, vous retrouver un token ene même temps que l'URL seul ce token permet un accès au fichier (inaccessible hors DB2, donc) Avec les droits FS, le fichier est accessible normalement, seule la suppression est impossible tant qu'il est lié par DB2. Un fichier stream ne peut être lié qu'UNE SEULE FOIS ! (impossible d'attribuer la même photo à deux articles) il est impossible de lire le contenu d'un DATALINK, seules les fonctions associées peuvent être manipulées (voir plus loin) |
mise en place : PGM CRTJRNRCV JRNRCV(AF400/AF4RCV0001) THRESHOLD(5000) + TEXT('RECPTEURURNAL AF400') CRTJRN JRN(AF400/AF4JRN) JRNRCV(AF400/AF4RCV0001) + MNGRCV(*SYSTEM) DLTRCV(*YES) + TEXT('JOURNAL POUR AF400') STRJRNPF FILE(AF400/AF4URLP1) JRN(AF400/AF4JRN) + IMAGES(*AFTER) OMTJRNE(*OPNCLO) WRKRDBDIRE /* pour vérifier le nom RDB */ STRTCPSVR SERVER(*DLFM) ADDPFXDLFM PREFIX(('/AF4DIR')) ADDHDBDLFM HOSTDBLIB((AF400)) HOSTDB(S44R7480) ENDPGM |
lors de nos tests, nous avons été obligés d'utiliser un fichier source, avec PTF SF99104 au niveau 6 minimum, ["dspdtaara sf99104" pour voir le niveau] Qtxtsrc/hdb contenant : "AF400 QSYS S44R7480" sur une seule ligne puis la commande ADDHDBDLFM SRCFILE(QTXTSRC) SRCMBR(HDB) ensuite Qtxtsrc/pfx contenant : "/AF4DIR/AF4SRC/" sur une seule ligne puis la commande ADDPFXDLFM SRCFILE(QTXTSRC) SRCMBR(PFX) vous pouvez aussi utiliser directement le script dfmadmin sur un SHELL QSH tapez STRQSH [si QSH est installé, c'est l'option 30 de 5769SS1] puis dfmadmin -help, qui vous donne le détail (de toutes façons, la commande appelle ce script) |
$ dfmadmin Usage: /usr/bin/dfmadmin [-debug] {-create|-delete|-drop} [<table>] /usr/bin/dfmadmin [-debug] {-deletex|-createdb|-dropdb|-help|-sts} /usr/bin/dfmadmin [-debug] {-start|-shutdown|-rmipc|-restart|-clnup} /usr/bin/dfmadmin [-debug] -setup [<dlfm_db_config_file>] /usr/bin/dfmadmin [-debug] -add_db < db_data_file /usr/bin/dfmadmin [-debug] -add_prefix < prefix_data_file Description: -createdb Creates DLFM database. -create Creates all tables in DLFM database. -create <name> Creates only the table <name> in DLFM database. List of tables: dfm_access, dfm_archive, dfm_dbid, dfm_file, dfm_grp, dfm_prfx, dfm_url, dfm_xnstate, dfm_backup. -delete Deletes data from all tables in DLFM database. -delete <name> Deletes data from table <name> in DLFM database. -deletex Deletes data from all tables other than dfm_dbid, dfm_prfx and dfm_boot in DLFM database. |
-drop Drops all tables in DLFM database. -drop <name> Drops the table <name> in DLFM database. -dropdb Drops the database DLFM database. -add_db Reads data from standard input and adds to the dfm_dbid database. The input is the authorized databases which can talk to this DLFM; the input should be in the following format: dbname instancename nodename i.e. SAMPLE DBINST narang.almaden.ibm.com A null line terminates the input data. User can keep these entries in a file and redirect the file as an input. -add_prefix Reads data from standard input and adds to the dfm_prfx database. The input is the list of authorized mount points (called prefix within DLFM). The input should have one line for each pathname. i.e /home/video_repository A null line terminates the input data. User can keep these entries in a file and redirect the file as an input. |
-del_prefix Read data from standard input and delete from the dfm_prfx database those entries matching the input data. The input data is the same for add_prefix. User can keep these entries in a file and redirect the file as an input. -debug Echoes the command to-be-done without doing anything. -steps Shows help message for the recommended steps for sane operations. -start Starts DLFM server. You should perform createdb, create (tables), add_db and add_prefix before running the server. -stop Stops the DLFM server. Server must be running if you want to stop it. -shutdown Shuts down the server. Use this command in case stop command does not work. This command try to stop the DLFM server cleanly else kills it removes the ipcs. This command takes 30 to 40 secs for clean shutdown. -see Shows the dlfm processes running on the system. -rmipc Removes all IPCs used by your id. -restart Equivalent of stop and start. |
-setup Equivalent of createdb, create(tables). -cleanup Equivalent of shutdown and deletex. -help or -? Prints this message. insertion de lignes il faut utiliser la fonction DLVALUE('http://serveur/repertoire/fichier') INSERT INTO AF400/AF4URLP1 SELECT AF4MDL, AF4MBR, DLVALUE('HTTP://S44R7480/AF4DIR/'CONCAT TRIM(SRCLIB) CONCAT '/' CONCAT TRIM(SRCFIL) CONCAT '/' CONCAT TRIM(SUBSTR(SRCMBR, 2, 9)) CONCAT '.HTM', URL, 'commentaire') FROM AF400/AF4MBRP1 WHERE AF4TYP = '*TXT' AND AF4MBR LIKE '£%' ......................................................................... : dans cet exemple les noms des cours commencent par une livre (£) : : et pas les pages HTML. : :.......................................................................: |
DLVALUE vue plus haut , à utiliser pour renseigner un datalink DLVALUE('URL d'accès au fichier stream' ou ' ' [URL non renseignée] , URL , 'commentaire') URL et 'commentaire' sont facultatifs on peut assigner un commentaire à un datalink vide par DLVALUE(' ', URL, 'mon commentaire') Autres fonctions : ---------------- soit un datalink renseigné par DLVALUE('HTTP://S44R7480/AF4DIR/AF4SRC/cours.htm', URL, 'mon commentaire') |
DLURLCOMPLETE( ) -> retourne : 'HTTP://S44R7480/AF4DIR/AF4SRC/*****************cours.htm' où '*******************' est le token permettant l'accès au fichier stream pour les permissions Data base. DLURLPATH( ) -> /AF4DIR/AF4SRC/*****************cours.htm DLURLPATHONLY( ) -> /AF4DIR/AF4SRC/cours.htm DLCOMMENT( ) -> 'mon commentaire' DLLINKTYPE( ) -> URL (seule valeur admise aujourd'hui) DLURLSCHEME( ) -> HTTP: [ou FILE:] DLURLSERVER( ) -> S44R7480 |