Archive pour août 2012
DB2 SQL
Posté par D.E.S. dans capitalisation, GEEK le 24 août 2012
En vrac…
- interesting ressources : http://www.michael-thomas.com/tech/db2/db2_survival_guide.htm
- Lignes de commandes DB2 (Linux) :
# connect to the base
db2 connect to « DATABASE »
# define the schema
db2 set current schema = « SCHEMA »
# load a stored procedure creation script
db2 -td@ -vf SP_CREATION_SCRIPT.sql -z SP_CREATION_LOG.log
#ATTENTION => caractère de fin de script : @ à ne pas oublier
# load a SQL script
db2 -tvf SQLFILE.sql (=> IBM) - DB2 SQL PL – follow the guide(s) ! ;) => http://www.sqlpl-guide.com
- pour sortir une erreur à un endroit donné et tester sa propagation : SIGNAL / RESIGNAL
- Calculs en DB2 et format décimal
- comment ne pas engorger la mémoire avec une procédure chargeant trop de données en mémoire : découper ce jeu de données
- Dans mon cas la colonne discriminante était un Timestamp, il était donc sensé de découpé par intervalles de temps.
Concrètement, une PS de traitement entre deux Timestamps est elle même appelées par une PS d’appel découpant l’intervalle global a traiter en intervalles réduis évitant de charger trop de données à chaque appel de la PS de traitement
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465--call SCHEMA.CALLING_SP(6);--drop PROCEDURE SCHEMA.CALLING_SP;--drop table SCHEMA.TRACE_TABLE;--create table SCHEMA.TRACE_TABLE (--TRACE_LDT_ID TIMESTAMP,--TRACE_COMM VARCHAR(100)--);CREATE PROCEDURE SCHEMA.CALLING_SP(INTERVAL_HOURS INT)LANGUAGE SQLBEGINdeclare INIT_TIMESTAMP TIMESTAMP;declare FINAL_TIMESTAMP TIMESTAMP;declare INTERMEDIATE_START TIMESTAMP;declare INTERMEDIATE_STOP TIMESTAMP;delete from SCHEMA.TRACE_TABLE;delete from SCHEMA.WORK_TABLE; -- target table for the TREATING_SP strored procedureset INIT_TIMESTAMP = TIMESTAMP(CHAR(DATE('2000-07-01'), ISO),'00:00:00');set FINAL_TIMESTAMP = TIMESTAMP(CHAR(DATE('2000-08-01'), ISO),'00:00:00');set INTERMEDIATE_START = INIT_TIMESTAMP;set INTERMEDIATE_STOP = INTERMEDIATE_START + INTERVAL_HOURS hour;-- insert into SCHEMA.TRACE_TABLE-- values (INIT_TIMESTAMP, 'FINAL_TIMESTAMP : ' || char(date(FINAL_TIMESTAMP),iso) || ' ' || char(time(FINAL_TIMESTAMP),iso));loop_time_range:loopcall SCHEMA.TREATING_SP(INTERMEDIATE_START, INTERMEDIATE_STOP);if INTERMEDIATE_STOP >= FINAL_TIMESTAMPthen-- insert into SCHEMA.TRACE_TABLE-- values (INIT_TIMESTAMP,-- 'END : ' ||-- char(date(FINAL_TIMESTAMP),iso) || ' ' || char(time(FINAL_TIMESTAMP),iso)-- || ' < ' ||-- char(date(INTERMEDIATE_STOP),iso) || ' ' || char(time(INTERMEDIATE_STOP),iso)-- );call SCHEMA.TREATING_SP(INTERMEDIATE_START, FINAL_TIMESTAMP;leave loop_time_range;elsecall SCHEMA.TREATING_SP(INTERMEDIATE_START, INTERMEDIATE_STOP);end if;set INTERMEDIATE_START = INTERMEDIATE_STOP;set INTERMEDIATE_STOP = INTERMEDIATE_START + INTERVAL_HOURS hour;-- insert into SCHEMA.TRACE_TABLE-- values (INIT_TIMESTAMP,-- 'FROM - TO : ' ||-- char(date(INTERMEDIATE_START),iso) || ' ' || char(time(INTERMEDIATE_START),iso)-- || ' - ' ||-- char(date(INTERMEDIATE_STOP),iso) || ' ' || char(time(INTERMEDIATE_STOP),iso)-- );end loop loop_time_range;END
- Dans mon cas la colonne discriminante était un Timestamp, il était donc sensé de découpé par intervalles de temps.