02 - Database DB2 for i02a - SQL02c - Varie Database DB2 for i

Utility XSQL: “Compilare” oggetti SQL nelle librerie desiderate – Part.2 –

Last Updated on 3 Novembre 2019 by Roberto De Pedrini

Il comando RUNSQLSTM permette di eseguire script SQL contenuti in file IFS o in classici membri di un file source. Un limite di questo comando sta nel fatto che è possibile eseguire solo script “statici”, e non vi è modo di passare dei parametri variabili che possano pilotarne l’esecuzione (per esempio, nomi di librerie per generare gli oggetti o per referenziare le tabelle di una VIEW, oppure valori di filtro per clausole WHERE, campi di ordinamento per le ORDER BY, ecc…).
Presentiamo qui una piccola utility che supera questa limitazione: il comando XSQL permette di specificare un parametro nel quale si potranno passare dei valori variabili, che verranno sostituiti ai “segnaposto” opportunamente impostati nello script.
Vediamo nel dettaglio il funzionamento; questo è il prompt del comando XSQL:

                       XSQL - Esecuzione script SQL (XSQL)                      
                                                                                
 Immettere le scelte e premere Invio.                                           
                                                                                
 Libreria source  . . . . . . . . SRCLIB    __________                           
 File source  . . . . . . . . . . SRCFILE   __________                           
 Membro . . . . . . . . . . . . . SRCMBR    __________                           
 File di flusso . . . . . . . . . STMF      ________________________________     
____________________________________________________________________________     
____________________                                                             
 Parametri  . . . . . . . . . . . PARMS     ________________________________     
____________________________________________________________________________     
____________________________________________________________________________     
____________________________________________________________________________     
____________________________________________________________________           

I primi quattro parametri sono abbastanza evidenti, qui va specificato dove si trova il sorgente che contiene lo script da eseguire (membro di file source oppure file IFS, in alternativa). E’ l’ultimo parametro PARMS che fa tutto il gioco… qui è infatti possibile specificare dei “nomi” di variabili ed il loro valore, che verrà sostituito nello script nella posizione in cui compare la variabile. La sostituzione avviene in un membro source temporaneo, per cui lo script originale non viene alterato.
I nomi delle variabili vanno racchiusi entro due caratteri delimitatori; il tool utilizza le parentesi quadre. Anche nel sorgente dello script le variabili devono comparire tra delimitatori, vedremo più avanti degli esempi. Il formato di ogni variabile da passare è:

  • aperta parentesi quadra “[“
  • nome della variabile, così come appare nello script. Io utilizzo lo “stile CL”, con un ampersand iniziale ed una o più lettere per distinguere le variabili (es &L, &LIB, ecc…)
  • chiusa parentesi quadra “]”
  • segno di uguale “=”
  • valore da sostituire – SENZA APICI. Gli apici vanno indicati nello script, in modo da facilitare la composizione della stringa del parametro PARMS.

Esempi di variabili: [&L]=LIB001, [ &F] = FILE001, [&DATA ] = 20191101 ecc..
Come si può notare degli esempi, il tool ignora tutti gli spazi interni ai separatori, quelli tra il separatore finale ed il segno uguale, ed esegue la TRIM della stringa compresa fra il segno uguale ed il successivo separatore iniziale. Gli spazi interni alla stringa che contiene il valore sono così preservati.
Vediamo un esempio pratico di script contenente delle variabili ed il corrispondente comando XSQL per eseguirlo. Lo script è memorizzato nel file QSQLSRC della libreria MDUCA1:

CREATE TABLE [&L].Tab0101 AS (
SELECT articolo, YEAR(datamovimento) anno,
  SUM(CASE 
  WHEN segno='+' THEN quantita 
  ELSE -1 * quantita 
  END) saldo
FROM   mduca1.movmag00f
WHERE  YEAR(datamovimento) = [&Y]
GROUP BY articolo
ORDER BY articolo, YEAR(datamovimento)
) WITH DATA
;

Questo script crea nella libreria (specificata in una variabile) la tabella TAB0101 con il saldo degli articoli ricavati dai movimenti di magazzino di un determinato anno, passato anch’esso come variabile.
Ecco il comando XSQL che esegue lo script, con le relative variabili:

XSQL SRCLIB(MDUCA1) SRCFILE(QSQLSRC) SRCMBR(TAB0101) PARMS('[&L]=MDUCA2   [&Y]=2019 ')

Questo è il risultato:

Cancellando la tabella e rilanciando il comando con un altro anno, otteniamo i risultati corrispondenti:

DLTF MDUCA2/TAB0101
XSQL SRCLIB(MDUCA1) SRCFILE(QSQLSRC) SRCMBR(TAB0101) PARMS('[&L]=MDUCA2   [&Y]=2018 ')

Il bello di questo tool è che nelle variabili del parametro PARMS si possono impostare non solo dei classici valori di campo “singoli”, ma anche intere porzioni dello script da eseguire: campi di ordinamento, clausole WHERE, nomi dei file, ecc. L’unica limitazione è la dimensione del parametro PARMS (200 caratteri in questa versione “standard”).
Vediamo un esempio in cui passiamo come variabile una parte del nome della tabella da creare, la libreria di destinazione e i campi di ordinamento. Questo è lo script:

CREATE TABLE [&L].Saldi[&Y] AS (                
WITH a AS (                                     
SELECT articolo, YEAR(datamovimento) anno,      
  SUM(CASE                                      
  WHEN segno='+' THEN quantita                  
  ELSE -1 * quantita                            
  END) saldo                                    
FROM   mduca1.movmag00f                         
WHERE  YEAR(datamovimento) = [&Y]               
GROUP BY articolo, YEAR(datamovimento)          
)                                               
SELECT * FROM a                                 
ORDER BY [&O]                                   
) WITH DATA  

Eseguiamo lo script passando l’anno 2018 e l’ordinamento per codice articolo:

XSQL SRCLIB(MDUCA1) SRCFILE(QSQLSRC) SRCMBR(TAB0102) PARMS('[&L]=MDUCA2 [&Y]=2018  [&O]=articolo  ')  

Controlliamo il risultato:

E’ stata creata la tabella SALDI2018 con i saldi di magazzino di quell’anno, ordinati per codice articolo.
Passiamo ora l’anno 2019 e cambiamo l’ordinamento:

XSQL SRCLIB(MDUCA1) SRCFILE(QSQLSRC) SRCMBR(TAB0102) PARMS('[&L]=MDUCA2 [&Y]=2019 [&O]=saldo DESC') 

Et voilà ! Abbiamo una nuova tabella (SALDI2019) con le righe ordinate per saldo decrescente.

Grazie a questo piccolo tool possiamo aggiungere notevole flessibilità ai nostri script SQL.

I sorgenti completi del tool XSQL si possono trovare su GitHub a questo link:

https://github.com/MD2706GIT/XSQL

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

About author

Senior Analyst/Developer e divulgatore in ambito IBM i. Già collaboratore dell'edizione italiana della rivista "System i News" ed autore di diverse pubblicazioni su tools e tecniche di sviluppo in ambiente IBM i.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *