Connetti il tuo audi o - La trasmissione inizierà a breve Chiama tramite PC: Comunica Connessione audio Chiama tramite computer - IBM

Pagina creata da Pasquale Costa
 
CONTINUA A LEGGERE
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