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: