2
IBM Developer Kit for JavaDriver JDBC locale� Classe com.ibm.db2.jdbc.app.DB2Driver
� URL jdbc:db2://NomeDB dove NomeDB èuna voce di WRKRDBDIRE (posso utilizzare jdbc:db2://*local
� /QIBM/ProdData/OS400/Java400/ext/db2_classes.jar
� Si aggancia ad un lavoro server di preavvionnnnn/QUSER/QSQSRV
� Lavora per conto del profilo utente di logon, ma non assume la JOBD legata a tale profilo, e non richiama neppure eventuali programmi iniziali: attenzione alla lista librerie! (Mantenuta libreria corrente)
3
IBM Toolbox for Java
� Libreria 100% pure Java per accedere a risorse AS400
� Utilizzabile sia su client, sia su AS400
� Contiene (tra le altre cose)� Driver JDBC� Classi per richiamo programmi, accesso a code
dati, profili utente, stampe, messaggi, job, aree dati, IFS, valori di sistema, stato del sistema...
� Classi di utilità (es. table model Swing bufferizzato “MS Access”-like, JarMaker per estrarre sottoinsiemi di classi da un Jar)
4
IBM Toolbox for JavaDove trovarlo� Installato su AS400 come programma su licenza
(gratuito) nell’IFS� /QIBM/ProdData/HTTP/Public/jt400/lib/jt400.jar
� Installato a richiesta con Client Access (i-SeriesAccess)� C:\Programmi\IBM\Client Access\jt400\lib\jt400.jar
� Scaricabile gratuitamente da internet nella sua versione open-source (JTOpen). E’ sempre la versione più aggiornata, che consiglio di usare.
� Sul server AS400 richiede l’installazione e l’avvio degli Host Servers
5
� Driver di tipo 4� Classe com.ibm.as400.access.AS400JDBCDriver
� URL jdbc:as400://nomeOIpAs[/libreria][;listaProprietà]
� Si appoggia allo stesso demone di sistema utilizzato da ODBC: QZDASRVSD� Avviato con STRHOSTSVR *DATABASE
� In ascolto su porta TCP 8471� Associa ad ogni client un lavoro di preavvio
� nnnnnn/QUSER/QZDASOINIT
IBM Toolbox for JavaJDBC
6
IBM Toolbox for JavaJDBC: QZDASOINIT� E’ utile abbassare la priorità di default di tale
lavoro e regolare il numero di lavori avviati automaticamente� CRTCLS CLS(ODBC) RUNPTY(25)
TIMESLICE(3000)
� CHGPJE SBSD(QUSRWRK) PGM(QZDASOINIT) INLJOBS(20) THRESHOLD(15) ADLJOBS(5) CLS(ODBC)
� Esempio per avviare automaticamente 20 lavori, aggiungerne automaticamente 5 quando ne sono in esecuzione meno di 15 ed avviarli a priorità 25 (piùveloci dei batch e più lenti degli interattivi)
� Su V4Rx il sottosistema è QSERVER
7
IBM Toolbox for JavaJDBC: properties� Impostabili anche nell’URL, per esempio:
jdbc:as400://myAS;trace=true;user=pino;password=x;
� Vediamone alcune� transaction isolation gestione transazioni.
Se i file non sono sotto giornale, occorre impostare il valore none , che non è il default!
� server trace gestione log su AS400. � Valore 4: avvia STRDBG per QZDASOINIT, che
registra anche suggerimenti per costruzione indici.� Valore 8: salva JOBLOG per QZDASOINIT.
8
IBM Toolbox for JavaJDBC: properties
� trace gestione ordinamento/ricerche. � Valore true : stampa sullo standard output del client
la registrazione dettagliate di tutte le chiamate JDBC. � Forte scadimento delle prestazioni: solo per debug.
� sort gestione ordinamento/ricerche. � Valore language : effettua ricerche/ordinamenti in
base alla lingua specificata nella proprietà sortlanguage (per noi ITA ).
� Impostando tale valore è possibile effettuare ricerche non case-sensitive (sul modello MS SQLServer).
� Possibile scadimento delle prestazioni.
9
IBM Toolbox for JavaJDBC: Exit programs� E’ possibile eseguire un programma su AS400
� Al collegamento di ogni client � Punto di uscita QIBM_QZDA_INIT
� Prima dell’esecuzione di ogni statement SQL� Punto di uscita QIBM_QZDA_SQL1
� Tali programmi ricevono in ingresso i dati della richiesta (profilo utente, statement SQL...) e restituiscono un flag che indica se accettarla.
� Gestiti con il comando WRKREGINF
10
IBM Toolbox for JavaJDBC: Exit programs� Un esempio CL per il controllo del collegamento
PGM PARM(&STATUS &REQUEST)
/* Flag di accettazione/rifiuto richiesta */
DCL VAR(&STATUS) TYPE(*CHAR) LEN(1)
/* Parametro di ingresso contenente anche il nome u tente */
DCL VAR(&REQUEST) TYPE(*CHAR) LEN(2000)
DCL VAR(&UTENTE) TYPE(*CHAR) LEN(10)
/* Di default rifiuto tutte le connessioni */
CHGVAR VAR(&STATUS) VALUE('0')
/* Recupero nome utente */
CHGVAR VAR(&UTENTE) VALUE(%SST(&REQUEST 1 10))
/* Abilito solo le connessioni di FRANCO */
IF COND(&UTENTE *EQ 'FRANCO') THEN(CHGVAR +
VAR(&STATUS) VALUE('1'))
ENDPGM
� Per attivare il programmaADDEXITPGM EXITPNT(QIBM_QZDA_INIT) FORMAT(ZDAI0100) PGMNBR(1) PGM(LIB/PGM)
(Tutti i pgm QZDASOINIT in esecuzione devono essere riavviati)
11
IBM Toolbox for JavaJDBC: chiamata programmi� E’ possibile richiamare un qualsiasi programma
AS400 da una connessione JDBC utilizzando lo statement SQL CALL
� Se non si devono ricevere dei parametri di ritorno dal programma, non è necessario creare anticipatamente una definizione di Storedprocedure
� Altrimenti occorre prima definire la procedura con lo statement SQL CREATE PROCEDURE
12
IBM Toolbox for JavaJDBC: chiamata programmi� Esempio di chiamata a programma senza
restituzione parametri: il programma chiamato…
PGM PARM(&FILE &LIB)
DCL VAR(&FILE) TYPE(*CHAR) LEN(10)
DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
CPYF FROMFILE(&LIB/&FILE) TOFILE(QSYSPRT)
ENDPGM
13
IBM Toolbox for JavaJDBC: chiamata programmi� …ed il programma chiamante
try {
Class.forName("com.ibm.as400.access.AS400JDBCDriver ");
Connection c = DriverManager.getConnection(
"jdbc:as400://AS400;user=PIPPO;password=X");
Statement s = c.createStatement();
s.execute(
"CALL MYLIB.MYPGM ('NOMEFILE ', 'NOMELIB ')");
} catch (Exception e) {}
� Fate attenzione agli spazi nei parametri stringa: devono riempire la capacità della variabile (nell'esempio 10 caratteri)
14
IBM Toolbox for JavaJDBC: chiamata programmi� Esempio di chiamata a programma con
restituzione parametri: il programma chiamato…PGM PARM(&INGR &USC)
DCL VAR(&INGR) TYPE(*CHAR) LEN(10)
DCL VAR(&USC) TYPE(*CHAR) LEN(2)
CHGVAR VAR(&USC) VALUE('KO')
IF COND(&INGR *EQ 'FRANCO') THEN(CHGVAR +
VAR(&USC) VALUE('OK'))
ENDPGM
� Lo statement SQL di creazione proceduraCREATE PROCEDURE MYLIB.MYPGM2(IN INGR CHAR (10 ), O UT USC CHAR (2
)) LANGUAGE CL NOT DETERMINISTIC CONTAINS SQL EXTER NAL
PARAMETER STYLE GENERAL
15
IBM Toolbox for JavaJDBC: chiamata programmi� …ed il programma chiamante
try {
Class.forName("com.ibm.as400.access.AS400JDBCDriver ");
Connection c = DriverManager.getConnection(
"jdbc:as400://AS400;user=PIPPO;password=X");
CallableStatement cs =
c.prepareCall("CALL MYLIB.MYPGM2 (?, ?)");
cs.registerOutParameter(2, Types.CHAR);
cs.setString(1, "FRANCO");
cs.executeUpdate();
System.out.println("Risultato: " + cs.getObject(2)) ;
} catch (Exception e) {}
16
IBM Toolbox for JavaJDBC: esecuzione comandi� Come eseguire un comando?
� Con il programma di sistema qcmdexc , che ha come primo parametro un comando e come secondo la lunghezza del primo parametro
try {
Class.forName("com.ibm.as400.access.AS400JDBCDriver ");
Connection c = DriverManager.getConnection(
"jdbc:as400://AS400;user=PIPPO;password=X");
CallableStatement cs =
c.prepareCall("CALL qsys.qcmdexc (?, ?)");String cmd = "CHGJOB RUNPTY(15)";
cs.setString(1, cmd);
cs.setObject(2, new Integer(cmd.length()));
cs.execute();
} catch ( Exception e) {}
17
IBM Toolbox for JavaJDBC: esecuzione comandi� Utilizzando l'interfaccia CallableStatement ,
occorre prima creare la definizione di storedprocedure con:
CREATE PROCEDURE QSYS.QCMDEXC(IN CMD VARCHAR(1024),
IN CMDLEN DECIMAL(15, 5)) EXTERNAL NAME QSYS.QCMDEX C LANGUAGE C GENERAL
18
IBM Toolbox for JavaJDBC: esecuzione comandi� L'esempio precedente potrebbe essere
realizzato anche senza l'utilizzo di CallableStatement :
try { Class.forName("com.ibm.as400.access.AS400JDBCDriver ");
Connection c = DriverManager.getConnection(
"jdbc:as400://AS400;user=PIPPO;password=X");
Statement s = c.createStatement();
s.execute(
"call qsys.qcmdexc('CHGJOB RUNPTY(15)',000000017.000 00)");
} catch (Exception e) {}
19
IBM Toolbox for JavaJDBC: esecuzione comandi� Nell'esempio precedente abbiamo modificato la
priorità del lavoro JDBC che serve le nostre chiamate. Questo può essere fatto solo se il profilo utente di collegamento ha l'autorizzazione speciale *JOBCTL
20
IBM Toolbox for JavaJDBC� Come scambiare grosse quantità di dati?
� Tramite file nella libreria QTEMP: libreria "virtuale" di cui esiste una istanza per ogni lavoro. I file creati in tale libreria sono visibili solo dal lavoro corrente e vengono cancellati automaticamente alla fine del lavoro stesso.
� Tramite file normali, magari indicizzati dal numero di lavoro, reperibile come nell'esempio iniziale (ricordarsi di riorganizzare con RGZPFM)
21
IBM Toolbox for JavaJDBC� Come estrarre un sottoinsieme di classi dal
Toolbox (es. JDBC)?� Con la classe AS400ToolboxJarMaker (solo
JTOpen):java -cp jt400.jar utilities.AS400ToolboxJarMaker
-component JDBC -ccsid 1144
estrae le classi necessarie al dirver JDBC per la code-page italiana con simbolo euro (1144)
� Estensione di JarMaker : classe di JTOpen per l’estrazione da file Jar dell’insieme minimo di classi necessarie per l’esecuzione di una classe.
Top Related