Connetti il tuo audi o - La trasmissione inizierà a breve Chiama tramite PC: Comunica Connessione audio Chiama tramite computer - IBM
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
La trasmissione inizierà a breve Connetti il tuo audi o Chiama tramite PC: Comunica Connessione audio Chiama tramite computer oppure Chiama via telefono: 02 87103980 - ID Evento: 928 036 288#
Il meeting verrà Tutte le linee sono Potete sottomettere Se avete domande, registrato e sarà silenziose per i vostri commenti potete sottoporle in disponibile dopo garantire un buon durante l’evento qualsiasi momento l’evento per il ascolto usando l’apposita nel box “Q&A” – riascolto funzione “Chat” le risposte verranno fornite alla fine
Relatori Nicoletta Bernasconi Product Manager - Power Systems IBM i IBM Italia nicoletta_bernasconi@it.ibm.com Roberto De Pedrini Fondatore di Faq400 roberto.depedrini@faq400.com
Radio Mr. i - 12 aprile 2019 ore 12:00 SQL, per lo sviluppatore che non deve chiedere mai! Nicoletta Bernasconi – IBM Italia nicoletta_bernasconi@it.ibm.com
Radio Mr. i 2019 – calendario primo semestre 22 febbraio - Strumenti di accesso e gestione dell'ambiente IBM i http://ibm.biz/Radio_Mri1 22 marzo - Monitoraggio del funzionamento di un sistema IBM i http://ibm.biz/Radio_Mri2 12 aprile - SQL, per lo sviluppatore che non deve chiedere mai! http://ibm.biz/Radio_Mri3 17 maggio - Come accedere in modo ottimizazto a Db2 for i tramite PHP http://ibm.biz/Radio_Mri4 14 giugno - Integrazione tra IBM i e Intelligenza artificiale http://ibm.biz/Radio_Mri5 Chi fosse interessato alle trasmissioni della passata edizione, può scaricare il materiale e le registrazioni dal sito http://ibm.com/it/ibmi © 2019 IBM Corporation 5
DB2 for i e SQL: aree strategiche del sistema operativo www.ibm.com/developerworks/ibmi/techupdates/db2 © 2019 IBM Corporation 6
Radio Mr. i - 12 aprile 2019 ore 12:00 SQL, per lo sviluppatore che non deve chiedere mai! Roberto De Pedrini – Faq400 roberto.depedrini@faq400.com
SQL – Structured Query Language Cos’è? Cosa è: Un linguaggio standard, indipendente dalla piattaforma per la definizione e manipolazione dei dati di un DB Relazionale. Nasce nel 1974 nei laboratori IBM e arriva ufficialmente sul «mercato» nel 1983 proprio con il DB2… Giochiamo quindi in casa sul nostro IBM i!
SQL La «classificazione» delle istruzioni SQL • DDL = Data Definition Language • Create Table, Alter Table, Create Index, Create View, Drop… • DML = Data Manipulation Language SQL/PL • Insert into, update, delete from… Un vero linguaggio di programmazione • DQL = Data Query Language procedurale! • Select campo from tabella, join, • DCL = Data Control Language • Grant, Revoke … • TCL = Transaction Control Language • Commit, Rollback
SQL Perché? Per la perfomance! Per la sicurezza! Per l’integrità! Per Log e Audit!
SQL Interfacce SQL STRSQL Interactive SQL Per eseguire al volo istruzioni SQL, DDL e DDM. Utilissimo F4=Prompt Limitate possibilità di export dei risultati Gestione delle sessioni (script) non comodissima Alcune nuove funzioni SQL non funzionano da STRSQL!
SQL Interfacce SQL SQL Embedded RPG/Cobol Utilizzare SQL Embedded dentro le nostre procedure RPG (o Cobol) ottimizza, semplifica, eleva all’ennesima potenza le possibilità di interrogazione e manipolazione dei dati.
SQL Interfacce SQL RUNSQLSTM Membro FAQ400/SRC(SQL001) Utilizzabile in un CL/RPG per CL: ADDLIBLE FAQ400; eseguire uno script anche di più INSERT INTO T1 VALUES(’A’, 17); comandi. DELETE FROM MYLOG Limitati i comandi gestibili per WHERE DATALOG
SQL Interfacce SQL RUNSQL Esempio Utilizzabile nei CL, limitato ad un PGM PARM(&LIB) solo statement SQL DCL &LIB TYPE(*CHAR) LEN(10) DCL &SQLSTMT TYPE(*CHAR) LEN(1000) CHGVAR VAR(&SQLSTMT) + VALUE(’DELETE FROM qtemp.worktable1 + WHERE table_schema = ’’ || &LIB || ’’’) RUNSQL SQL(&SQLSTMT) COMMIT(*NONE) NAMING(*SQL) ENDPGM
SQL Interfacce SQL ACS / Rdi Esegui Script SQL Vantaggi: • Export dei risultati • Salva e ripristina script • Inserisci da esempio Svantaggi: • Manca F4!
SQL Interfacce SQL Rdi – Prospettiva Sviluppo Database Rational Rdi arriva con una installazione minimale di IBM Data Studio, la prospettiva Sviluppo Database Benvenuto CTRL-Space!
SQL Interfacce SQL IBM Data Studio (Free!) Uno potente strumento per la modellazione del Database: - Script - Replica di modifiche/creazioni tra differenti Schema/Partizioni - CTRL-Space!
SQL Interfacce SQL Dbeaver Community Edition Veloce, multi-database, interfaccia semplice. E ctrl-space!
SQL La terminologia SQL Terminologia SQL Terminologia tradizionale (IBMi / AS400) Schema o Collection Library - Libreria Table Physical File – File Row Record Column Field - Campo View Logical File - Vista Logica Index Keyed Logical File – Isolation Level Commitment control level Log Journal Catalog (risultato di DSPFD-DSPFFD) Global Variable (una sorta di Area Dati)
SQL Creazione DDL dai nostri PF (conversion tool) Generare DDL da un oggetto File Fisico esistente: • «Schemi» di ACS! • «Schemi» dal Database di Navigator for i Web o System i Navigator Oppure CALL QSYS2.GENERATE_SQL ('EMPLOYEE', 'SAMPLEDB', 'TABLE', 'QDDLSRC', ‘SAMPLEDB', ‘EMPLOYEE',CREATE_OR_REPLACE_OPTION => '1', CONSTRAINT_OPTION => '2');
SQL DDL vs DDS (Table vs Phisical File)
SQL DDL vs DDS Perché? • I/O Nativo (Chain/Setll..) sì (*) • Migliorata la validazione dei dati (all’insert/update) -> Performance (25:1) • Gestione dei Vincoli-Constraint (Unique, Primary Key, Foreign Key, Table Check) • Nomi di tabella, indici, campi, constraint… lunghi e significativi • Audit Columns (generated always columns) • Index Performance (64K/8K + Shared Access Paths –Evi) • Campi Blob e nuovi tipi dato • Viste – Views (Semplificano – non appesantiscono – cambio tipo dato) • Create or Replace (*) Attenzione alle colonne «generated always»
SQL RPG I/O Nativo o SQL Embedded? • I/O Nativo (chain, update, write…) • OK per accesso al singolo record • SQL Embedded • Prestazioni dell DB2 Optimizer (scelta index automatica o proposta) • Join tra tabelle, modifica della logica di reperimento dei dati
SQL Trucchi – Barbatrucchi (e tecniche) con SQL
SQL Modernizzare senza rompere tutto! (trick 01) File fisico CLIENTI0F Table CLIENTITAB A UNIQUE Create table CLIENTITAB ( A R CLIENTIR ID Integer Generated always as Identity, A CLCODICE 10A CLCODICE char(10) not null A CLRAGSOC 35A ,CLRAGSOC char(35) not null A CLINDI 35A ,CLINDI char(35) not null A CLLOCA 35A ,CLLOCA char(35) not null A CLNAZ 2A ,CLNAZ char(2) not null A K CLCODICE ,Audit_change_user VARCHAR(128) GENERATED ALWAYS AS (SESSION_USER) ,Audit_change_jobname VARCHAR(28) GENERATED ALWAYS AS (QSYS2.JOB_NAME) ,Audit_TS_LastUpdate Timestamp Generated always for each row on update File logico x Nazione CLIENTI0L as row change Timestamp A R CLIENTIR PFILE(CLIENTI0F) ,constraint CLIENTITAB_CODICE_PK UNIQUE(CLCODICE)) A K CLNAZ Copio i dati dal file fisico insert into CLIENTITAB (CLCODICE,CLRAFSOC,CLINDI,CLLOCA,CLNAZ) select CLCODICE,CLRAFSOC,CLINDI,CLLOCA,CLNAZ from CLIENTI Ricreo CLIENTI0F come Logical File su CLIENTITAB A R CLIENTIR PFILE(CLIENTITAB) No Level Check A CLCODICE 10A Exceptions A A CLRAGSOC CLINDI 35A 35A A CLLOCA 35A A CLNAZ 2A A K CLCODICE Gli altri logical file di CLIENTI0F vanno “puntati” su CLIENTITAB sempre con il dettaglio dei campi come il “vecchio fisico”
SQL Generated Always Columns
SQL DDL e Dizionario (Field Reference File) – Trick 02 CREATE TABLE clientitab AS (SELECT id as id_cliente , RagioneSociale , Indirizzo , cast(‘’ as char(35)) as Nome_dello_zio FROM Dizionario) WITH NO DATA
SQL MQT Materialized Query Table – Trick 03 create table sampledb.mqt_employee as (select workdept, sum(salary) as DeptSalary from sampledb.employee group by workdept) DATA INITIALLY DEFERRED -- (inizialmente vuota/popolata) REFRESH DEFERRED -- (non aggiornata automaticamente) MAINTAINED BY USER; select * from sampledb.mqt_employee order by workdept; refresh table sampledb.mqt_employee;
SQL System Catalog Trick 04 select system_table_schema, system_table_name, table_type from QSYS2.SYSTABLES where system_table_schema='SAMPLEDB'; select system_table_schema, system_table_name, system_index_name from QSYS2.SYSINDEXES where system_table_schema='SAMPLEDB’; Select table_name, system_table_name, column_name, system_column_name from QSYS2.SYSCOLUMNS Where table_schema=‘SAMPLEDB’ and table_name=‘EMPLOYEE’;
SQL UDF SQL o RPG – Trick 05 create or replace function faq400.data8( data8 dec(8,0)) returns char(10) language sql begin return char(date(timestamp_format(char(data8),'YYYYMMDD')), iso); end; select cliente, NrFattura, data8(Datafat) as DataFat from XSTATIS0F where data8(Datafat) > current date – 12 months
SQL OLAP Function – Quante possibilità – Trick 06 SELECT empno, firstnme, lastname, salary, RANK() OVER(ORDER BY SALARY DESC) as ClassRank, DENSE_RANK() OVER(ORDER BY SALARY DESC) as ClassDenseRank, ROW_NUMBER() OVER(ORDER BY SALARY DESC) as ClassRowNumber FROM SAMPLEDB.EMPLOYEE FETCH FIRST 10 ROWS ONLY;
SQL Derived Index – Performance – Trick 07 CREATE INDEX upper_lastname_ix ON table1( UPPER(lastname) ) CREATE INDEX shipdate_year_ix ON table1( YEAR(shipdate) )
SQL Order by [Column Number] – Trick 08 SELECT EMPNO, SALARY+BONUS as TotalSalary FROM sampledb/employee Order by 2 desc; CREATE VARIABLE FAQ400.campo CHAR(10) DEFAULT 'SALARY‘ SELECT EMPNO, CASE WHEN FAQ400.campo=‘SALARY’ then SALARY else BONUS end as Campo FROM sampledb/employee Order by 2 desc;
SQL Order by [forzatura] – Trick 09 SELECT Nazione, sum(Fatturato) from STATISTICO Where DataFattura between current date – 1 month and current date Order by case when Nazione=‘IT’ THEN 0 else 1 end, Nazione; Esempio 2: SELECT Nazione, sum(Fatturato) from STATISTICO Where DataFattura between current date – 1 month and current date Order by locate (Nazione, ‘ITDEFR’);
SQL Division By Zero– Trick 10 With DatiGiornalieri as (SELECT 0 as RigheOrdini, 1 as RigheDDT from sysibm.sysdummy1) SELECT DEC(DOUBLE(RigheOrdini) / DOUBLE(RIgheDDT), 13, 6) AS Rapporto From DatiGiornalieri;
SQL SQL e file Multimembro– Trick 11 CREATE ALIAS STAT/STATISTICHE2017 FOR STAT/STATISTICHE(2017); SELECT * FROM STAT/STATISTICHE2017
SQL Merge (Upsert)– Trick 12 merge into listino0f as tgt using (select * from ListNew0f) as src on tgt.codice=src.codice when matched then update set tgt.prezzo=src.prezzo when not matched then insert values (src.codice, src.prezzo);
SQL Ma il NULL è uguale al NULL ? – Trick 13 Select * from AnagraficaClienti where datacreazione IS NOT DISTINCT FROM dataaggiornamento;
SQL Rimuovere blanks duplicati – Trick 14 select codice, descrizione, replace( replace( replace(descrizione,' ','') ,'>
SQL L’ultimo ID – Trick 15 select id into :lastID from final table ( insert into clientitab values ( default, :codice, :ragionesociale, default, default, default ) );
SQL e IBM i Vuoi saperne di più ? Evento ONL-i DAYS Milano 10/11 Giugno 2019 http://www.faq400events.com
SQL e IBM i Vuoi saperne di più ? Nuovo Blog Faq400 http://blog.faq400.com
IBM Client Center Milano, 11 LUGLIO 2017 I nostri contatti: nicoletta_bernasconi@it.ibm.com Roberto.Depedrini@faq400.com I prossimi appuntamenti di Radio Mr.i 17 maggio - Come accedere in modo ottimizazto a Db2 for i tramite PHP http://ibm.biz/Radio_Mri4 14 giugno - Integrazione tra IBM i e Intelligenza artificiale http://ibm.biz/Radio_Mri5
IBM Client Center Milano, 11 LUGLIO 2017
Puoi anche leggere