02a - SQL

SQL: SELECT con i “superpoteri”

Tutti noi utilizziamo quotidianamante l’istruzione SELECT per recuperare dati dal database. La SELECT è quindi generalmente considerata un’istruzione “passiva”, che si limita a restituire risultati senza alterare nulla.
Ma con una piccola aggiunta, anche una normalissima SELECT può trasformarsi in una azione “attiva”, in grado di agire sul database ma anche sul sistema !
Il segreto sta nell’accoppiata tra la SELECT e la ben nota procedura QCMDEXC, che consente di eseguire un comando CL, e che a partire dalle versioni 7.4 TR4 e 7.3 TR10 viene fornita anche sotto forma di funzione scalare. Questo fa si che QCMDEXC sia richiamabile all’interno di qualsiasi query SQL.

Vediamo subito un esempio pratico: la ridenominazione di massa di un gruppo di file IFS.
Nelle applicazioni è comune avere delle funzioni che creano dei file IFS con una certa denominazione, li inviano a server remoti e poi li rinominano in modo che non vengano più considerati nel successivo ciclo di elaborazione. In questo esempio abbiamo 5 file .csv nella nostra cartella IFS:

Supponiamo di averli inviati al server remoto tutti insieme (per esempio tramite FTP con un comando MPUT), ora vogliamo rinominarli tutti cambiando l’estensione da “.csv” a “.ok” in modo da identificare i file elaborati.
Grazie alle funzioni e ai servizi SQL, siamo in grado di rinominare in un colpo solo tutti i file, cambiandogli l’estensione.
Ecco l’istruzione:

---- RENAME di massa di file IFS
-- 1: estrazione elenco file IFS da rinominare
WITH a AS (
SELECT path_name, 
 UPPER(REPLACE(path_name, '/home/MDUCA/FAQ400_15/', '')) filename   
FROM TABLE(ifs_object_statistics(
START_PATH_NAME => '/home/MDUCA/FAQ400_15',
SUBTREE_DIRECTORIES => 'NO' , 
OBJECT_TYPE_LIST =>  '*ALLSTMF'
))
WHERE  UPPER(path_name) LIKE '%/FILE%.CSV'
)
-- 2: composizione comando CL
, b AS (
SELECT 
'REN OBJ(''' CONCAT TRIM(path_name) CONCAT ''') NEWOBJ(''' 
CONCAT REPLACE(filename, '.CSV', '.OK') CONCAT
''')' cmd
FROM   a
)
-- 3: esecuzione comandi
SELECT b.*, qsys2.qcmdexc(cmd)
FROM   b
;

Analizziamola in dettaglio: nella prima CTE, con il servizio IFS_OBJECT_STATISTICS estraiamo l’elenco dei file della cartella /home/MDUCA/FAQ400_15; viene estratto il percorso completo (path_name) ed il solo nome del file (convertito in maiuscolo, per considerare maiuscole e minuscole indistintamente). L’elenco filtra solo i file con nome che inizia con “FILE” e con estensione “.csv”.

Con la seconda CTE si legge l’elenco appena estratto e si compone il comando di ridenominazione oggetto (REN); questo è il comando che verrà dato in pasto alla procedura QCMDEXC. In questa fase la fatica peggiore è come sempre litigare con gli apici…

Per finire, leggendo con una SELECT l’elenco dei comandi REN composti prima e passandoli come parametro alla funzione QCMDEXC, i comandi di sistema verranno eseguiti. La funzione QCMDEXC restituisce “1” se il comando è andato a buon fine, altrimenti restituirà il valore “-1”.

Ed ecco i nostri file rinominati come desiderato.

L’accoppiata vincente tra SELECT e QCMDEXC può trasformarsi in un utile e potente strumento per eseguire massivamente comandi a fronte di un elenco di elementi, evitando di doverlo fare uno per uno manualmente. Si pensi per esempio alla ricompilazione di tutti i source di una certa libreria, allo spostamento in altre librerie di oggetti non utilizzati, e via dicendo.
I servizi e le funzioni del DB2 si confermano strumenti efficacissimi per semplificare la vita degli sviluppatori, conoscerli ed applicarli correttamente permette di ottenere applicazioni chiare, di facile manutenzione e soprattutto… moderne !

DOCUMENTAZIONE:
Table function IFS_OBJECT_STATISTICS
https://www.ibm.com/docs/en/i/7.4?topic=services-ifs-object-statistics-table-function

Funzione scalare QCMDEXC
https://www.ibm.com/docs/en/i/7.4?topic=services-qcmdexc-scalar-function

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

Recent Posts

IBM i: La gestione del sistema è più semplice di quanto pensi

Con questo post voglio consigliarti la lettura di questo articolo di Giancarlo Lui sulla TechXChange Community: IBM i System Management:…

2 mesi ago

RPG Free e option(*convert) per una migliore gestione parametri

Nel suo recente articolo "Option *convert in RPG Free" , Aldo Succi esplora l'opzione *CONVERT nel linguaggio RPG, evidenziando come…

2 mesi ago

Aggiornamento Certificati CA per BCE: Guida Pratica

Guida pratica all'aggiornamento dei certificati Java e DCM per consumo web services via SQL HTTPGETCLOB e HTTP_GET.

2 mesi ago

Gestione dei file video bloccati su IBM i: una soluzione efficace

Riceviamo e pubblichiamo ben volentieri questo "tip & trick" di Patrick Rizzi che presenta una tecnica che permette di intervenire…

6 mesi ago

Monitoraggio Messaggi QSYSOPR: SQL per Ottenere Messaggi e Reply

Prendo spunto da una risposta di Michael Mayer sulle mailing list di Midrange.com a chi chiedeva come monitorare i messaggi…

6 mesi ago

Perché l’ERP è la Chiave del Successo per le Imprese Moderne

Le imprese sono sempre più alla ricerca di strumenti che possano migliorare l'efficienza, la collaborazione e la gestione delle risorse.…

8 mesi ago