Last Updated on 25 Giugno 2020 by Roberto De Pedrini
Eccoci alla quarta parte di questo “FAQ & Howtos” per SQL e DB2 for i … le precedenti 3 “puntate” di queste Faq le potete trovare in fondo a questo post negli “Articoli Corretali” … ma veniamo alle nuove FAQ:
Index
iDB2-FAQ-031 – QYS2.IFS_OBJECT_PRIVILEGES … DB2 for i Service … per controllare autorizzazioni di oggetti IFS
Se avete la fortuna e l’attenzione di stare aggiornati con il sistema operativo e avete installato la TR8 per 7.3 o la TR2 per 7.4 avete a disposizione un ottimo DB2 for i service per il controllo delle autorizzazioni di file e directory IFS; “IFS_OBJECT_PRIVILEGES”:
select * from table (
QSYS2.IFS_OBJECT_PRIVILEGES( path_name=>'/home/faq400/*');
Ce ne parlano Tim Rowe e Scott Forstie in questo webinar del Commo: Manage your IFS with IBM i services
iDB2-FAQ-032 – Creare CSV con SQL (con “Leading Zeros” per i numeri decimali da -1 a +1)
Prendendo spunto da una richiesta sulle mailing list di Midrange.com dove si chiedeva come ottenere un CSV mantenendo i “leading zeros” dai numeri decimali (da -1 a +1) come nel caso del valore 0.12 da portare nel CSV come “0.12” e non “.12” come fa il normale comando CPYTOIMPF.
Ho trovato su Gist Github delle ottime procedure SQL di Niels Liesberg … con poche righe in più alla procedura SQL_TO_CSV di Niels possiamo mantenere i Leading Zeros nel CSV creato!
Ecco i pochi e semplici passi:
- Creare la procedura IFS_APPEND – https://gist.github.com/NielsLiisberg/9ca47191bae9f301c0f00310201aaab6
- Creare la procedura IFS_WRITE – https://gist.github.com/NielsLiisberg/3a5ea6d03687310f877ec65a7748e196
- Creare la procedura SQL_TO_CSV – https://gist.github.com/NielsLiisberg/3bc04d45c39a816c4b52760d6f861c8b
Alla ottima procedura di Niels applicare questa semplice modifica
.....
get descriptor 'modified' value colNo
colValue = DATA;
--------------------------------
-- Start FAQ400 Modifications
---------------------------------
-- If is a number from -1 to +1 add a leading 0 (example .12 --> 0.12)
if colType in (2, 3) then
if to_number(colValue)>0 and to_number(colValue)<1 then
set colValue = '0' concat colValue;
elseif to_number(colValue)>-1 and to_number(colValue)<0 then
set colValue = '-0' concat substr(colValue, 2);
end if;
end if;
--------------------------------
-- End FAQ400 Modifications
---------------------------------
if colType in (1, 12) then -- char or varchar
....
Ora proviamo a creare un CSV da una semplice tabella con dati numerici, decimali, negativi ecc
create table faq400.testtable
(alfa01 char(10),
num01 decimal(15, 2),
num02 decimal(15, 4));
insert into faq400.testtable
(alfa01, num01, num02)
values('A', 0.12, 0.1234),
('B', 1.12, 1.1234),
('C', 0.00, 100),
('D', -0.10, -0.1234);
call QUSRSYS.sql_to_csv(
sql_statement => 'SELECT * FROM faq400.testtable',
output_file => '/tmp/testtable.csv'
);
E questo è il risultato (considerando che in Italia usiamo la virgola decimale):
iDB2-FAQ-033 – Leggere le variabili di Ambiente ENVVAR da SQL?
Dai nostri programmi RPG possiamo leggere i valori delle variabili di ambiente ENVVAR con le apposite API di sistema … oppure utilizzare questa ottima procedura SQL di Niels Liesberg:
ENVVAR.SQL – https://gist.github.com/NielsLiisberg/093b9bc18b603abac5a297ec239aa690
iDB2-FAQ-034 – Tenere sotto controllo la directory /tmp di IFS
Nella directory /tmp di IFS spesso si accumulano file temporanei … con poche righe di SQL proposte da Scott Forstie in uno dei suoi Gist di Github, riusciamo a tenerlo sotto controllo:
Bringing order to the IFS: https://gist.github.com/forstie/eb619063f46284365901dc88033bc6ce
iDB2-FAQ-035 – Vari formati di timestamp
Timestamp e precisione decimale … ce ne parla Simon Hutchinson su RPGPGM.COM – SQL NOW and playing with timestamps
SELECT NOW() AS NONE,
NOW(0) AS ZERO,
NOW(1) AS ONE,
NOW(6) AS SIX,
NOW(12) AS TWELEVE
FROM SYSIBM.SYSDUMMY1;
Dalla TR2 della 7.4 (o TR8 per la 7.3) , in RPG, è disponibile anche un livello superiore di precisione a 32 decimali …. con la %BIF %TIMESTAMP(*UNIQUE).
Vedi IBM i 7.4 – TR2 Enhancements
iDB2-FAQ-036 – QSYS.QADBFDEP Alternativa SQL a DSPDBR
Esiste una ottima alternativa SQL al comando DSPDBR per vedere logici, index, viste e MQT legate, ad esempio, ad una tabella – phisical file … eccone un esempio di utilizzo:
Select *
From QSYS.QADBFDEP
Where dbffil = 'MYTABLE' and dbflib='MYLIB';
Maggiori informazioni in questo post di RPPGM.COM: Getting database relationships using SQL
iDB2-FAQ-037 – Cercare nelle stringhe (campi char-varchar) dei caratteri “speciali”
Se dobbiamo creare l’apostrofo oppure il segno percentuale o l’underscore dentro i campi char/varchar di una tabella dobbiamo utilizzare i caratteri Escape … come già ne parlavamo nella iDB2-FAQ-001 “Come faccio a cercare % Percentuale o _ Underscore con SQL LIKE?“
Anche in questo post su RPGPGM.COM Simon Hutchinson ne parla: “Searching for reserved characters in SQL“
--- Roberto De Pedrini Faq400.com